变量
- 只读变量
1 2 3 4 5
# 等号与变量名和值之间不能有空格 # 只读变量,不能被重新赋值 readonly name="\nbinli" # -e 参数可以显示被转移的符号,没有参数会原样输出 echo -e $name
- 删除变量
1
unset name
语句
- if 语句
1
2
3
if condition; then
# do stuff
fi
- for 循环
1
2
3
for file in `ls /`; do
echo $file
done
- while 循环
1
2
3
4
5
6
7
8
9
10
i=1
max=20
sum=0
# 注意 [[ $i -le $max ]] 这里必须这么写,否则会报错
while [[ $i -le $max ]]; do
echo $i
let sum+=$i
let i++
done
echo $sum
数组
字符串
- 字符长度:
echo "len: ${#name}"
- 内容是为空:
[[ -z $msg ]]
- 内容非空:
[[ $msg ]]
文件
- 存在文件:
[[ -f CNAME ]]
特殊变量
$0
当前脚本的文件名$n (n>=1)
传递给脚本或函数的参数$#
传递给脚本或函数的参数个数$*
传递给脚本或函数的所有参数$@
传递给脚本或函数的所有参数$?
上个命令的退出状态或函数的返回值$$
当前 shell 进程 的 id (对于 shell 脚本,就是脚本所在的进程 id)- 示例(保存以下脚本为 xxx.sh)
1 2 3 4 5 6 7 8
#!/bin/bash echo "Process ID: $$" echo "File Name: $0" echo "First Parameter : $1" echo "Second Parameter : $2" echo "All parameters 1: $@" echo "All parameters 2: $*" echo "Total: $#"
当被 ""
所包含时,$*
和 $@
的区别
"$*"
会将所有的参数从整体上看做一份数据,而不是把每个参数都看做一份数据"$@"
仍然将每个参数都看作一份数据,彼此之间是独立的- 示例(保存以下脚本为 xxx.sh)
1 2 3 4 5 6 7 8 9 10 11 12 13
#!/bin/bash echo "print each param from \"\$*\"" # 只循环一次 for var in "$*" do echo "$var" done echo "print each param from \"\$@\"" # 循环 $# 次 for var in "$@" do echo "$var" done
变量键盘读取、数组与声明
变量键盘读取:read
read atest
:将输入内容赋值给atest
变量read -p 'please enter (yes/no) ' -t 30 confirm
:提示 30s 内输入yes/no
并赋值给confirm
声明:declare/typeset
declare [-aixr] name
-a
:声明变量为array
类型-i
:声明变量为int
类型-x
:声明变量为环境变量-r
:声明变量为readonly
- 示例:
1 2
$ declare -i sum=100+300+400 # 计算总和 $ echo $sum # 输出 800
数组
执行多个指令
cmd ; cmd
:不考虑命令的相关性连续执行cmd && cmd
:当且仅前命令执行成功时,才执行后命令cmd || cmd
:若前命令执行成功则后命令不执行,反之后命令执行