Shell 编程学习笔记——初探shell语法
-
如何使用bash执行脚本
- bash < test.sh
- bash test.sh // bash 脚本名 [参数]
- ./test.sh // 这种方式会使用脚本内的#! 后面的参数 比如#! /bin/bash -v 相当于 bash test.sh -v
- . test.sh // · ex3[参数]
-
变量赋值
- dir = `pwd`
- dir = $(pwd) // $(命令表)
-
数组
Bash
只提供一维数组,并且没有限定数组的大小。类似与 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标。下标可以是整数或算术表达式,其值应大于或等于 0 。用户可以使用赋值语句对数组变量赋值。-
赋值, 数组名[下标]
city[0] = beijing // 此处有坑, 等号两边不能加空格
city[1] = shanghai
city[2] = shenzhen
-
显示声明数组 declare -a 数组名
declare -a city
-
访问, ${数组名[下标]}
echo ${city[0]}
echo ${city[1]}
-
组合赋值(初始化)。格式:数组名=(值1 值2 值3)
city=(beijing shanghai shenzhen)
tianxu@DLC00078F8D43D:/mnt/c/Users/xu.tian/shellScript$ echo ${city[2]} ${city[0]} shenzhen beijing
-
访问数组所有元素。 使用*和@
$ echo ${city[*]} beijing shanghai shenzhen echo ${city[@]} beijing shanghai shenzhen
-
获取数组元素个数
echo ${#shell[*]}
-
-
传递参数方式一, 在shell脚本中使用
$1
,$2
这样的格式使用参数,其中1和2的编号分别对应用户传进来的参数的顺序,例如:bash add.sh 1 2-
编写脚本
add.sh
let sum=$1+$2 echo $sum
-
传递参数执行脚本
$ bash add.sh 10 11 21
-
-
传递参数方式二,自定义参数名称
-
修改脚本
add.sh
let sum=$X+$Y echo $sum
-
传递参数执行脚本
$ X=10 Y=11 ./add.sh 21
使用这种语法是可以的,也尝试过使用bash add.sh X=10 Y=11 和 ./add.sh X=10 Y=11都会报错
-
-
设置环境变量
export myhome=/home/myhome
-
键盘输入值
-
编写脚本
input.sh
#! /bin/bash read -p "请输入一个数值:" num echo "你输入的数值是:" ${num}
-
执行脚本
$ ./input.sh 请输入一个数值:111 你输入的数值是: 111
-
-
设值变量只允许读
tianxu@DLC00078F8D43D:/mnt/c/Users/xu.tian/shellScript$ java_home=java tianxu@DLC00078F8D43D:/mnt/c/Users/xu.tian/shellScript$ readonly java_home tianxu@DLC00078F8D43D:/mnt/c/Users/xu.tian/shellScript$ java_home=ss -bash: java_home: readonly variable
-
条件测试命令——test
语法:
test 表达式
如果表达式为真,则返回真,否则,返回假。-
数值比较
-eg ==;-ne !=;-gt >;-ge >=;-lt <;-le <=
-
测试文件属性
文件的可读、可写、可执行,是否为普通文件,是否为目录分别对应:
-r; -w; -x; -f; -d
$ test -r filename
-
-
字符串
- 非空 -n , 空 -z
- 可以使用 = 或者 != 以及 < 等符号按照字典序比较
-
运算符
可用该命令进行的运算有:
算术运算:
+ - * / %
;逻辑运算:= ! < <= > >=
如:
$ i=5;expr $i+5
另外,
bc
是一个命令行计算器,可以进行一些算术计算。 -
流程控制
-
if分支, 输入一个路径,判断该路径是文件还是文件夹,输出当前文件,或文件夹下的所有内容
#! /bin/bash if test -f $1; then echo "是一个文件" cat $1 elif test -d $1; then echo "进入了文件夹" $1 cd $1 && cat * else echo "not a file or dir" fi
-
case分支,输入一个数字,判断是星期几
#! /bin/bash case $1 in 1) echo "周一";; 2) echo "周二";; 3) echo "周三";; *) echo "随便周几吧。";; esac
-
while循环, 写一个死循环,直到用户输入Y|y时退出
#! /bin/bash while [ $input!="Y" ] && [ $input!="y" ] do echo "break loop?" read input case $input in (y|Y) break;; (n|N) continue;; esac done
-
for循环, 计算1到10的和
#! /bin/bash sum=0 for((i=1;i<=10;i++)); do sum=$[$sum+$i] done echo $sum
计算斐波那契1
#! /bin/bash fib[0]=1 fib[1]=1 for((i=2;i<10;i++)); do ((fib[$i]=fib[$i-1]+fib[$i-2])) done echo ${fib[*]}
计算斐波那契2
#! /bin/bash fib[0]=1 fib[1]=1 for((i=2;i<10;i++)); do let fib[$i]=fib[$i-1]+fib[$i-2] done echo ${fib[*]}
for_in 1
#! /bin/bash for i in {1..10} do echo $(($i * 3 + 1)); done
for_in 2
#! /bin/bash arr=$(seq 1 10) echo ${arr[*]} for i in $arr do echo $(($i * 3 + 1)) done
for_copy
#! /bin/bash files=$(ls) for filename in $files do cp $filename $filename".old" done
for_rm (这个是因为之前for_copy的时候不小心把copy的文件带了一个+号,所以删掉带+号的文件,后来又修改了copy的代码 就是上面的那个)
#! /bin/bash files=$(ls) for filename in $files do case $filename in *+*) rm $filename ;; esac done
-