如何使用bash执行脚本
bash < test.shbash 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" ficase分支,输入一个数字,判断是星期几
#! /bin/bash case $1 in 1) echo "周一";; 2) echo "周二";; 3) echo "周三";; *) echo "随便周几吧。";; esacwhile循环, 写一个死循环,直到用户输入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 donefor循环, 计算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)); donefor_in 2
#! /bin/bash arr=$(seq 1 10) echo ${arr[*]} for i in $arr do echo $(($i * 3 + 1)) donefor_copy
#! /bin/bash files=$(ls) for filename in $files do cp $filename $filename".old" donefor_rm (这个是因为之前for_copy的时候不小心把copy的文件带了一个+号,所以删掉带+号的文件,后来又修改了copy的代码 就是上面的那个)
#! /bin/bash files=$(ls) for filename in $files do case $filename in *+*) rm $filename ;; esac done