Linux Shell 学习笔记
# #!是一个约定标记,告诉系统用哪个Shell来执行
#!/bin/bash
# echo:在控制台窗口输出文本
echo "hello world"
# 添加可执行权限
chmod +x ./test.sh
# 执行脚本
./test.sh
# 变量命名规则
# 1,变量名和=之间不能有空格;
# 2,由英文字符、数字、下划线组成,不能数字开头,不能使用bash关键字
# 使用变量
# $变量名 或者 ${变量名} 推荐
# 设置变量只读
readonly 变量名
# 删除变量(不能删除只读变量)
unset 变量名
# 变量类型
# 1,局部变量:在脚本或命令中定义,仅在当前shell实例中有效,其他shell不能访问
# 2,环境变量:所有的包括shell启动的程序都能访问,有些程序依靠环境变量运行。shell脚本可以定义环境变量
# 3,shell变量:由shell程序设置的保证shell正常运行的特殊变量。
# Shell字符串
# 1,单引号:任何字符都会原样输出,所以变量是无效的;不能出现单独的一个单引号,可以成对出现拼接
# 2,双引号:可以有变量,会转义字符
# 3,不用引号
# 获取字符串长度
${#string}
# 提取字串:从第二个字符开始截取 4个字符,有头有尾
${string:1:4}
# 查找字符串:查找字符i或o的位置(哪个字符先出现就计算哪个)
`expr index "$string" io`
# Shell数组:只支持一维数组,元素用空格分隔
# 定义:数组名=(值1 值2 ... 值n)
# 读取某个数组
${数组名[下标]}
# 读取所有元素
${数组名[@]}
# 获取数组元素个数
length=${#数组名[@]}
length=${#数组名[*]}
# 获取数组中单个元素的长度
lengthn=${#数组名[n]}
# Shell注释
# 单行:#
# 多行:
:<<EOF
注释内容
注释内容
EOF
# Shell参数传递
# 脚本中定义$n,如$1 $2 $3
# 运行时传递 A B C
# 算术运算符:使用反引号``括起来,算术运算符两侧必须有空格
`expr $a + $b`
`expr $a - $b`
`expr $a \* $b`
`expr $a / $b`
`expr $a % $b`
# 条件表达式:[]括起来,[]同样必须有空格
[ $a == $b ]
[ $a != $b ]
# 关系运算符:-eq、-ne、-gt、-lt、-ge、-le
# 两边相等,返回true
[ $a -eq $b ]
# 逻辑运算符:!、-o、-a、||、&&,非、或、与、双与、双或,双与/双或要加上两个[]
# 字符串运算符:=、!=、-z、-n、$,等于、不等于、是否是0长度、是否不是0长度、是否为空
# 文件测试运算符:-d、-f、-r、-w、-x、-s、-e,文件夹、普通文件、可读、可写、可执行、文件大小不为0、存在
# read:从标准输入读取一行,并指定给变量
read inputStr
# echo:字符串输出
echo -e "a \n b" # -e 开启转义,\n 换行
# printf命令:
printf比echo移植性更好,基于POSIX标准。
printf format-string args...
%s:字符串格式化、%c:单个字符、%d:整数、%f:小数
%-10s:指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
printf "%s\n" aa bb cc:一个格式对多个参数,格式会被重用
printf "%s%c%d%f":没有参数,%s默认为NULL,%c默认为NULL,%d默认为0,%f默认为0.000000
printf转移序列:\b 回退、\n 换行、\r 回车、\t 水平制表符、\v 垂直制表符、\\ \
# Shell流程控制S
if else判断(判断分支不可为空)
# if else if1=100 if2=200 if test $[if1] -eq $[if2] then echo "$if1 等于 $if2" elif test $[if1] -gt $[if2] then echo "$if1 大于 $if2" else echo "$if1 小于 $if2" fi
for循环
# for forArr=(1 2 3 4 5) for i in ${forArr[*]} do echo "the value is $i" done
while循环
# while w1=1 while(( $w1<=5 )) # while后面还可以接read:while read inputStr do echo $w1 let "w1++" done
无限循环
incre=1 while true # 或者冒号: # for(( ; ; )) do echo "死循环啦$incre" let "incre++" done
until循环(与while相反)
# until:与while相反 u1=1 until [ ! $u1 -lt 3 ] # 只要u1不小于3,则执行do do echo $u1 u1=`expr $u1 + 1` done
case遍历
echo '请输入1-3之间的数字' echo '您输入的数字为:' read inputNum case $inputNum in 1) echo '您输入了1' ;; 2) echo '您输入了2' ;; 3) echo '您输入了3' ;; *) echo '您没有输入1-3之间的数字' ;; esac
break&continue
while : do echo -n "请输入1到5之间的数字" read inputNum case $inputNum in 1|2|3|4|5) echo "您输入的数字为$inputNum" ;; *) echo "您输入数字不在1到5之间" break # 跳出所有循环 # continue # 跳出当前循环,后面的语句不会被执行 # echo "GG" ;; esac done
# Shell函数
# 无参函数
myfunc01(){ echo "this is my first function" return `expr 1 + 2` } myfunc01 # 函数必须先定义再调用 echo "函数的返回值是: $? " # 函数的返回值通过 $? 获取
# 有参函数 myfun02(){ echo "$1" echo "$2" echo "$10" echo "${10}" # 当$后面>=10时,要使用${10} echo "传入的参数个数是 $# 个" } myfun02 1 2 3 4 5 6 7 8 9 33 44