运行
方法一:
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"
Comments NOTHING