Shell Script

Tecy 发布于 18 天前 62 次阅读


运行

方法一:

bash file.sh
source file.sh

方法二:

./file.sh

权限不够(增加可执行权限):

chmod +x file.sh

变量

系统预定义变量

$HOME
$PWD
$SHELL
$USER
...

自定义变量

变量默认为字符串,无法直接数值运算,含空格,括号等需要用 ""'' 不会解析里面的特殊符号。

局部变量:

var_name=value # 无空格
echo $var_name

修改为全局变量:

export var_name

撤销变量:

unset var_name

只读变量(不能撤销):

readonly var_name=value

特殊变量

  • $n: $0 表示脚本名称,$1~9 表示第一到9个参数,十以上的参数用大括号包含 ${10}
  • $#: 获取所有输入参数的个数(脚本名不计入参数)。
  • $*: 表示所有参数,看作一个整体(不含脚本名)。
  • $@: 表示所有参数,每个参数分别对待(不含脚本名)。
  • $?: 返回上一次命令返回状态,0 表示执行正确。

运算符

$((expr))$[expr] ,中间 expr 需要计算的表达式。

echo 1+2    # 1+2
echo $[1+2]    # 3

$(commnad) 利用commad的结果替换。

$(commnad)

条件

test condition

通过 $? 捕获结果, 0 为真,其他为假

test condition
$?

[ condition ] (注意两边要有空格)。

[ condition ]
$?

运算符两边都要有空格。

  • =: 等于[ $a = $b ]
  • !=: 不等于[ $a != $b ]
  • -eq: 等于[ $a -eq $b ]
  • -ne: 不等于[ $a -ne $b ]
  • -lt: 小于 [ $a -lt $b ]
  • -gt: 大于 [ $a -gt $b ]
  • -le: 小于等于[ $a -le $b ]
  • -ge: 大于等于 [ $a -ge $b ]
  • -r: 文件是否可读 [ -r file ]
  • -w: 文件是否可写 [ -w file ]
  • -x: 文件是否可执行 [ -x file ]
  • -e: 文件是否存在 [ -e file ]
  • -f: 文件是否存在且是常规文件 [ -f file ]
  • -d: 文件是否存在且是目录 [ -d dir ]
  • && 逻辑与,|| 逻辑或。

流程控制

if

单分支:

if [ condition ];then
    command
fi

if [ condition ]
then
    command
fi

多分支:

if [ condition ] 
then
    command
elif [ condition ]
then
    command
else
    command
fi

case

case $var_name in
value1)
    command
;;
value2)
    command
;;
*)
    command
;;
esac

*) 表示 default。

for

语法1:

for ((初始值;条件;变量变化))
do
    command
done

输入求和:

sum=0
for ((i=0; i <= $#; i++))
do
    sum=$[sum+i]
done

echo $sum

语法2:

for x in list
do
    command
done

输入求和:

sum=0
for val in $@
do
    sum=$[sum+val]
done
echo $sum

while

while [ condition ]
do
    command
done

函数

系统函数

  • basename: 返回路径最后的文件名。/home/.../file 返回 file
  • dirname: 返回路径,/home/.../file 返回 /home/.../file

自定义函数

需要先声明函数。

[function] func_name[()] {
    code
}
# function     可写可不写
# ()        可写可不写

通过 $? 获取返回值。

返回函数内最后一条指令的执行正确性(0~255)。

可以 return。

读取控制台输入

read
  • -p: 指定读取时的提示符。
  • -t: 指定读取的等待时间 (second),不加无限等待。
read -t 10 -p "input in 10 seconds" args
echo "$args"