shell脚本
shell脚本
工作控制、前景背景控制: (job control, foreground, background)
這部分我們在第十六章 Linux 程序控制中再提及!
在 bash 當中,當一個變數名稱尚未被設定時,預設的內容是『空』的。
参数设置:
name=zhang
- 等号两边不能有空格
name="is ${HOME}" name='is ${HOME}'
- 右侧值可以用单引号或双引号,双引号中变量仍然表示变量,单引号则为纯字符串
- 用反斜杠表示特殊符号(Enter $ 空白 单引号)的转义
- 用`指令`或者$(指令),来表示其他的指令 version=$(uname -r) 或 version=`uname -r`
- 使用export 使称为环境变量,从而在子程序中使用
- unset取消设定, 如unset myname
环境变量
- env查看所有预定义环境变量
- set查看环境变量+自定义变量
- export将自定义变量设置为环境变量,就可以被子程序使用
- declare将环境变量转变为自定义变量
- declare
确定参数类型,declare -i sum=100+200+500
变为环境变量,declare -x sum
变为自定义变量, declare +x sum
特殊字符:
*: 任意个字符
?: 1个任意字符
[]: 括号内的一个字符,如[ads]
[a-z]: a到z内容一个字符,还有[A-Z] [0-9]
[^]: 非括号内的一个字符,如[^abc] 表示不为abc中的任意一个
指令连续执行,没有相关性(;): 如 cmd1; cmd2
执行相关联执行(&&): 如 cmd1 && cmd2 , 表示cmd1执行成功则执行cmd2(即cmd1的$?为0)
执行相关联执行(||): 如 cmd1 || cmd2 , 表示cmd1执行失败则执行cmd2(即cmd1的$?不为0)
如 ls /tmp/abc && touch /tmp/abc/zhang.txt, 表示/tmp/abc存在则创建
shell的执行方式:
sh demo.sh 或者 ./demo.sh, 会用子shell执行脚本,结束后其中的参数不会在父shell中看到
source demo.sh,是当前shell执行脚本
test 查看文件是否存在等
-e 文件是否存在
-f 文件是否存在且为file
-d 文件是否存在且为目录
-r 是否存在且可读
-w 是否存在且可写
-x 是否存在且可执行
-nt (newer than) file1是否比file2新
-ot (older than) file1是否比file2旧
-ef 是否为同一档案,可用作判断hard link上,主要意义在判定是否均指向同一个inode
-eq 两数是否相等
-ne 是否不相等
-gt n1大于n2
-lt n1小于n2
-ge n1大于等于n2
-le n1小于等于n2
test -z string 字符串是否为空,为空则为true
test -n string 字符串是否为非空,为空则为false,-n可省略
test str1 == str2 字符串是否相等
test str1 != str2 是否不相等
-a 两状况同时成立, 如 test -r file -a -x file, 则同时具有r和w权限才返回true
-o 两状况任何一个成立
! 相反状态, 如test ! -x file, 当file不具备x时返回true
-z 参数是否为空或未定义
[]作为判断符
- 中括号内每个部分都要空格分隔
- 变量用双引号括起来
- 常量用单引号括起来
中括号的使用方法和test几乎一模一样,只是比较常用于if...then...fi中。
预设参数
$0 程序名称
$1 $2 $3 参数1、2、3
$# 参数个数
$@ 代表『 "$1" "$2" "$3" "$4" 』之意,每個變數是獨立的(用雙引號括起來);
$* 代表『 "$1c$2c$3c$4" 』,其中 c 為分隔字元,預設為空白鍵, 所以本例中代表『 "$1 $2 $3 $4" 』之意。
$@ 與 "$@" 的結果並不一樣喔!當你輸入的參數內帶有雙引號 (") 時,建議還是得要使用 "$@" 來帶入腳本中, 否則雙引號會被取消,這樣執行結果的差異會相當大喔!尤其是像『 ./script one "a to b" 』這種僅有兩個參數,但是參數內還有空白字元的, 最容易出現莫名的問題喔!
条件判断
if [ 条件判断式 ]; then
command
elif [ 条件判断 ]; then
command
else
command
fi
case语句
case $1 in
"hello")
echo "Hello"
;;
"")
echo "Must input param"
;;
*)
echo "Usage $0 {hello}"
;;
esac
函数功能
function fname() {
程序段
}
如function printit(){
echo -n "Your choice is "
}
while循环
while [ condition ]
do
command
done
或者
until [ conditon ]
do
command
done
例子
while [ "${yn}" != "yes" -a "${yn}" != "YES" ]
do
read -p "Please input yes/YES to stop this program: " yn
done
echo "OK!"
for循环
for var in con1 con2 con3 ...
do
command
done
如
#!/bin/bash
network="192.168.1"
for sitenu in $(seq 1 10)
do
ping -c 1 -w 1 ${network}.${sitenu} &> /dev/null && result=0 || result=1
if [ "${result}" == 0 ]; then
echo "Server ${network}.${sitenu} is Up."
else
echo "Server ${network}.${sitenu} is Down."
fi
done
for(( 初始值; 限制值; 执行步骤))
do
command
done
如
#!/bin/bash
read -p "Please input a number: " nu
s=0
for (( i=1; i<=${nu}; i=i+1))
do
s=$((${s} + ${i}))
done
echo "The result is ${s}"
shell script 的追蹤與 debug
sh [-nvx] scripts.sh
-n: 不执行,仅查询语法问题
-v: 执行前,先将脚本内容打印
-x: 将使用到的script内容展示到屏幕上
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」