Shell脚本语言 echo命令
?
-
显示普通字符串
脚本代码: echo "iPhone X 标配 8388元" 终端执行输出: iPhone X 标配 8388元
-
显示转义字符
脚本代码: echo "\"iPhone X 顶配 9688元\"" 终端执行输出: "iPhone X 顶配 9688元"
-
显示变量
脚本代码: iPhone="iPhone X" echo ${iPhone} 9688 终端执行输出: iPhone X 9688
-
显示换行
错误脚本代码: echo "iPhone X \n hello world!" 终端执行输出: iPhone X \n hello world! 正确脚本代码: echo -e "iPhone X \n hello world!" 终端执行输出: iPhone X hello world! 说明: -e: 表示开启转义功能.
-
不换行
脚本代码一:(换行) echo "iPhone X hello" echo "world!" 终端执行输出: iPhone X hello world! 脚本代码二:(不换行) echo -e "iPhone X hello \c " echo "world!" 终端执行输出: iPhone X hello world! 注意: -e: 表示开启转义功能,但是 \c 表示不换行.
-
显示一个执行命令
要求: 输出当前时间,还有很多命令后面学习. 脚本代码: echo `date` 终端执行输出: 2017年11月21日 星期二 16时20分43秒 CST
-
退出命令
语法: exit 状态->退出程序 脚本代码一: iPhone="买了一台iPhone X,摔爆了" echo ${iPhone} exit echo "哈哈,谁让你不小心..." 终端执行输出:(后面没有输出了,直接退出了) 买了一台iPhone X,摔爆了 脚本代码二: iPhone="买了一台iPhone X,摔爆了" echo ${iPhone} exit 0 echo "哈哈,谁让你不小心..." 终端执行输出:(结果同上)
Shell脚本语言 数组
?
- 语法
数组名=(值1 值2 值3...)
-
初始化数组
脚本代码一: name=("小明" "18" "全班最菜") echo $name 终端执行输出:(默认打印第一个元素) 小明 脚本代码二: name=() name[0]="小明" name[1]="Andy" name[2]="Jim" name[3]="最菜排名" echo ${name[1]} ${name[2]} 终端执行输出: Andy Jim
-
读取数组元素
语法结构:${数组名[下标]} 脚本代码: name=("小明" "18" "全班最菜") echo ${name[1]} 终端执行输出: 18 输出所有:"@"表示输出数组中所有的数据 脚本代码: name=("小明" "18" "全班最菜") echo ${name[@]} 终端执行输出: 小明 18 全班最菜
-
获取数组长度
获取数组元素个数语法一: ${#数组名[@]} 脚本代码: name=("小明" "18" "全班最菜") echo ${#name[@]} 终端执行输出: 3 获取数组元素个数语法二: ${#数组名[*]} 脚本代码: name=("小明" "18" "全班最菜") echo ${#name[*]} 终端执行输出: 3
-
获取单个元素字符长度
语法:${#数组名[下标]} 脚本代码: name=("小明" "18" "全班最菜") echo ${#name[2]} 终端执行输出: 4
Shell脚本语言 参数传递
?
-
语法定义
./文件名.sh 参数一 参数二 参数3 ...
-
案例需求
脚本代码: echo ${0} ${1} ${2} 终端执行命令: /shell.sh 豆你玩 蒜你狠 终端执行输出: ./shell.sh 豆你玩 蒜你狠 解释说明: ${0} -> 表示文件名称 ${1} -> 表示参数1 ${2} -> 表示参数2
-
特殊字符
-
$#: 表示获取脚本输入参数的个数
脚本代码: echo ${#} 终端执行代命令: ./shell.sh 豆你玩 蒜你狠 终端执行输出: 2
-
$*: 表示显示整个脚本输入的参数列表
脚本代码: echo ${*} 终端执行命令: ./shell.sh 豆你玩 蒜你狠 终端执行输出: 豆你玩 蒜你狠
-
Shell脚本语言 基本运算符
?
-
算术运算符->加减乘除等
-
+
运送注意: 'expr' 规定命令,并且规定命令后边和运算符两边都要有空格,否则会被当成字符串处理或者报错. 脚本代码: a=8388 b=9688 c=`expr $a + $b` echo c的值是: $c 终端执行输出: c的值是: 18076
-
-
运算注意: 'expr' 规定命令,并且规定命令后边和运算符两边都要有空格,否则会被当成字符串处理或者报错. 脚本代码: a=8388 b=9688 c=`expr $a - $b` echo "c的值是: $c" 终端执行输出: c的值是: -1300
-
*
号运算注意: 'expr' 规定命令,并且规定命令后边和运算符两边都要有空格,否则会被当成字符串处理或者报错. * 号需要转义一下 脚本代码: a=8388 b=9688 c=`expr $a \* $b` echo "c的值是: $c" 终端执行输出: c的值是: 81262944
-
/
运算注意: 'expr' 规定命令,并且规定命令后边和运算符两边都要有空格,否则会被当成字符串处理或者报错. ' / ' 只记整数部分,忽略小数部分 脚本代码: a=8388 b=9688 c=`expr $a / $b` echo "c的值是: $c" 终端执行输出: c的值是: 0
-
%
运算注意: 'expr' 规定命令,并且规定命令后边和运算符两边都要有空格,否则会被当成字符串处理或者报错. 脚本代码: a=8388 b=9688 c=`expr $a % $b` echo "c的值是: $c" 终端执行输出: c的值是: 8388
-
=
运算脚本代码: a=8388 b=$a echo "b的值是: $b" 终端执行输出: b的值是: 8388
-
==
运算注意: `[ ]` 内部要和变量之间以及`==`运算符和变量之间都要有空格,否则会报错. 脚本代码: a=8388 b=9688 if [ $a == $b ] then echo "a等于b" else echo "a不等于b" fi 终端执行输出: a不等于b
-
-
关系运算符
-
-eq
: 检测两个数是否相等,当相等时返回 true脚本代码: c=999 d=999 if [ $c -eq $d ] then echo "c等于d" else echo "c不等于d" fi 终端执行输出: c等于d
-
-ne
检测两个数是否相等,不相等返回 true脚本代码: c=999 d=999 if [ $c -ne $d ] then echo "c不等于d" else echo "c等于d" fi 终端执行输出: c不等于d
-
-gt
检测左边数是否大于右边,如果是,返回true脚本代码: c=100 d=200 if [ $c -gt $d ] then echo "c大于d" else echo "c不大于d" fi 终端执行输出: c大于d
-
-It
检测左边数是否小于右边数,如果是,返回true脚本代码: c=100 d=200 if [ $c -lt $d ] then echo "c小于d" else echo "c不小于d" fi 终端执行输出: c小于d
-
-ge
检测左边数是否大于等于(大于+等于)右边数,如果是,返回true.脚本代码: c=1000 d=200 if [ $c -ge $d ] then echo "c大于等于d" else echo "c小于d" fi 终端执行输出: c大于等于d
-
le
检测左边数是否小于等于右边数,如果是,返回true.脚本代码: c=100 d=200 if [ $c -le $d ] then echo "c小于等于d" else echo "c大于d" fi 终端执行输出: c小于等于d
-
-
布尔值运算符
-
-o
或运算,有一个表达式为true,则返回true.脚本代码: a=100 b=200 if [ $a -lt 200 -o $b -gt 200 ] then echo "成立" else echo "不等于" fi 终端执行输出: 成立
-
-a
与运算,两个表达式都是true,则返回true脚本代码: a=199 b=201 if [ $a -lt 200 -a $b -gt 200 ] then echo "成立" else echo "不等于" fi 终端执行输出: 成立
-
!
非运算, 表达式为false,加上!
运算则返回true,否则返回false.脚本代码: a=100 b=200 if [ $a != $b ] then echo "a不等于b" else echo "a等于b" fi 终端执行输出: a不等于b
-
-
逻辑运算符
-
&&
逻辑且 -> 相当于 and 的意思脚本代码: a=199 b=201 if [ $a -lt 200 ] && [ $b -gt 200 ] then echo "成立" else echo "不成立" fi 终端执行输出: 成立
-
||
逻辑或 -> 相当于 or 的意思脚本代码: a=199 b=201 if [ $a -lt 199 ] || [ $b -gt 200 ] then echo "成立" else echo "不成立" fi 终端执行输出: 成立
-
-
字符串运算
-
=
检测两个字符串是否相等,如果相等,返回true.脚本代码: a="hehe" b="hehe" if [ $a = $b ] then echo "字符串a 等于 字符串b" else echo "字符串a 不等于 字符串b" fi 终端执行输出: 字符串a 等于 字符串b
-
!=
检测两个字符串是否相等, 如果不相等,返回 true.脚本代码: a="hehe" b="hehe" if [ $a != $b ] then echo "字符串a 不等于 字符串b" else echo "字符串a 等于 字符串b" fi 终端执行输出: 字符串a 等于 字符串b
-
-z
检测字符串长度是否为0, 如果是 返回true脚本代码: a="hehe" if [ -z $a ] then echo "a为空,不存在" else echo "a存在值" fi 终端执行输出: a存在值
-
-n
检测字符串长度是否为0, 如果不是 返回true脚本代码: a="hehe" if [ -n "$a" ] then echo "a存在值" else echo "a不存在值" fi 终端执行输出: a存在值 注意: if 后中括号判断条件 $a 两边必须加了双引号 "$a",否则代码有问题
-
字符串
检测字符串是否为空, 不为空 返回true脚本代码: a="hehe" if [ $a ] then echo "a不为空" else echo "a为空" fi 终端执行结果: a不为空
-
-
文件测试运算符
-
-d file
检测文件是不是一个目录,如果是,那么返回true.脚本代码: file="/Users/junde/Desktop/shell.sh" if [ -d $file ] then echo "是一个目录" else echo "不是一个目录" fi 终端执行输出: 不是一个目录
-
-r file
检测文件是否可读,如果是 返回true脚本代码: file="/Users/junde/Desktop/shell.sh" if [ -r $file ] then echo "文件可读" else echo "文件不可读" fi 终端执行输出: 文件可读
-
-w file
检测文件是否可写脚本代码: file="/Users/junde/Desktop/shell.sh" if [ -w $file ] then echo "文件可写" else echo "文件不可写" fi 终端执行输出: 文件可写
-
x file
检测文件是否是可执行文件,如果是 返回true脚本代码: file="/Users/junde/Desktop/shell.sh" if [ -x $file ] then echo "文件可执行" else echo "文件不可执行" fi 终端执行输出: 文件可执行
-
-f file
检测文件是否是一个普通文件(既不是目录,也不是设备文件),如果是,那么返回true脚本代码: file="/Users/junde/Desktop/shell.sh" if [ -f $file ] then echo "文件为普通文件" else echo "文件为特殊文件" fi 终端执行输出: 文件为特殊文件
-
-s file
检测文件内部是否有内容,如果有内容 返回true创建一个空文本测试文件 `test.text` 脚本代码: file="/Users/junde/Desktop/test.text" if [ -s $file ] then echo "文件有内容" else echo "文件没有内容" fi 终端执行输出: 文件没有内容
-
-e file
检测文件是否存在(包含了:目录和文件), 如果是 返回true脚本代码: file="/Users/junde/Desktop/shell.sh" if [ -e $file ] then echo "存在" else echo "不存在" fi 终端执行输出: 存在
-
Shell脚本语言 流程控制
?
-
if
语句语法结构: if [条件] then 代码 else 代码 fi 脚本代码: 参照本文上面的例子即可
-
if else
语句的多种选择条件语法结构: if [条件] then 代码 elif [条件] then 代码 else 代码 fi 脚本代码: a=99 b=100 if [ $a = $b ] then echo "a的值等于b" elif [ $a ] then echo "$a" else echo "其他" fi 终端执行输出: 99
-
for
循环语句语法结构: for 变量名 in item1 item2 item3 ... do 代码 done 案例一: 简单的读取值 脚本代码: for num in 1 9 8 8 0 9 do echo ${num} done 终端执行输出: 1 9 8 8 0 9 案例二: 读取列表复杂值 -> 注意特殊字符需要转义 脚本代码:(错误代码) for name in "I don't know" do echo ${name} done 终端执行输出: I don't know 这种直接输出字符串,不会输出单个单词 脚本代码:(正确代码) for name in I don\' t know do echo ${name} done 终端执行输出: I don't know 案例三: 从变量读取里列表 脚本代码: var="I don't know" for name in ${var} do echo ${name} done 终端执行输出: I don't know 案例四: 读取目录 -> 通配符 脚本代码: file="/Users/junde/Desktop/*" for name in ${file} do echo ${name} done 终端执行输出: (太多了暂时省略一部分) /Users/junde/Desktop/Shell /Users/junde/Desktop/SwiftDemo /Users/junde/Desktop/YHPhotoBrowser 案例五: 嵌套循环(类似C语言写法) 脚本代码一:(普通循环) for ((a = 1; a < 5; a++)) do echo ${a} done 终端执行输出: 1 2 3 4 脚本代码二:(嵌套循环) for ((a = 1; a < 5; a++)) do echo a\-\>${a} for ((b = 1; b < 5; b++)) do echo "b-->${b}" done done 终端执行输出: a->1 b-->1 b-->2 a->2 b-->1 b-->2 a->3 b-->1 b-->2 脚本代码三: (无限循环) c=1 for ((;;)) do echo $c c=`expr $c + 1` done 终端执行输出:(省略...) 1 2 . . .
-
while
循环语法结构: while (条件) do 代码 done 脚本代码一: (基本循环) c=1 while(($c<5)) do echo $c c=`expr $c + 1` done 终端执行输出: 1 2 3 4 脚本代码二: (无限循环) c=1 while : do echo $c c=`expr $c + 1` done 终端执行输出:(省略...) 1 2 . . .
-
case
语句语法结构: case 值 in 模式1) 代码 ;; 模式2) 代码 ;; 模式3) 代码 ;; sac 脚本代码: number=1 case $number in 1) echo "等于1" ;; 2) echo "等于2" ;; 3) echo "等于3" ;; esac 终端执行输出: 等于1
-
until
循环?语法结构:(当条件为否的时候进入逻辑代码,无限循环) until 条件 do 逻辑代码 done 脚本代码: a=1 until (($a > 1)) do echo "i的值为 $a 小于等于1" done 终端执行输出: a的值为 1 小于等于1 a的值为 1 小于等于1 a的值为 1 小于等于1 ... 以上执行输出的时候:当条件为否的时候进入循环,是一个死循环,一直输出上面结果
如果上述有错误的地方,敬请告知,谢谢!