一、shell编程
1.简介
1.1什么是shell
把在终端运行的命令保存到文件中,这个文件就是shell程序
简单的说,shell编程就是第Linux命令的逻辑化处理
1.2shell解析器的类型
bash,ash,ksh等,默认使用bash
演示命令: echo $SHELL /bin/bash
1.3shell的作用
如果需要反复执行某些Linux命令,则可以将这些命令写到一个shell脚本中,然后每次只需要运行一下这个脚本即可
2.第一个shell程序
2.1实现
打开文本编辑器(可以使用 tou'ch命令来创建文件),新建一个文件 test.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好
代码演示:
#!/bin/bash #打印hello world echo "Hello World !"
2.2运行
方式一:作为可执行程序
touch test.sh vim test.sh chmod +x ./test.sh ./test.sh
方式二:作为解释器参数
/bin/bash test.sh
3.shell中的变量
3.1变量的定义
定义:变量名=值
演示命令: your_name="zhangsan" #定义变量没有$,赋值符中间不允许有空格 echo $your_name #使用是必须有$ num=10 echo ${num} #注意:变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界 echo "his name is ${your_name}"
3.2只读变量
readonly:只读,将变量声明为readonly,只读变量的值不能发生改变
myUrl="http://www.baidu.com" readonly myUrl myUrl="http://www.1000phone.com" #运行脚本,报错:/bin/sh: NAME: This variable is read only
3.3删除变量
unset:删除变量
代码演示: myUrl="http://www.baidu.com" unset myUrl echo $myUrl #变量被删除后不能再次使用。unset 命令不能删除只读变量。 #以上实例执行将没有任何输出
4.字符串和数组
4.1字符串
双引号或者单引号
单引号的限制:
a.单引号中的任何字符都会原样输出,单引号字符串中的变量是无效的
b.单引号字符串中不能再出现单引号【对单引号进行转义后去不起作用】
总结:
双引号:可以包含除了$、`、\、‘‘之外的任意字符
单引号:其中的任意字符都不会被解析,都会原样输出
反引号:会将其中的内容作为命令执行
反斜线:转义特定的字符,如:&、*、^、等
代码演示:
代码演示: #!/bin/bash #定义字符串 your_name='qinjx' str="Hello, I know you are \"$your_name\"! \n" #拼接字符串 your_name="qinjx" greeting="hello, "$your_name" !" greeting_1="hello, ${your_name} !" echo $greeting $greeting_1 #获取字符串长度 string="abcd" echo ${#string} #输出 4 #提取子字符串 string="1000phone is a great site" echo ${string:1:4} #包头包尾,下标从0开始计数 #查找子字符串 string="1000phone is a great company" echo `expr index "$string" is` #查找is在string中的位置,从1开始计数 #注意: 以上脚本中 "`" 是反引号,而不是单引号 "'",不要看错了哦
4.2数组
bash只支持一维数组,不支持多维数组
并没有限制数组的大小
数组元素的下标也是从0开始的,获取数组中的元素使用下标
定义数组:数组名=(值1 值2 值3....)
注意:shell中的数组元素之间使用空格分隔
代码演示:
#数组的定义 arr1=(10 20 30 40) echo $arr1 arr2=( 10 20 30 40 ) echo $arr2 #数组的使用 #读取数组中的元素 echo ${arr1[2]} #如果要读取数组中的全部元素 echo ${arr2[@]} # 取得数组元素的个数 length=${#arr1[@]} echo $length # 或者 length=${#arr1[*]} echo $length # 取得数组单个元素的长度 lengthn=${#arr1[3]} echo $lengthn
5.shell中的运算符
expr:是一款表达式计算工具,使用它能够完成表达式的求值操作(注意:计算符前后要加空格)
代码演示:
val=`expr 1 + 2` echo "两数之和为 : $val" #1.算术运算符 val=`expr $a + $b` echo "a + b : $val" val=`expr $a \* $b` echo "a * b : $val" #2.关系运算符 ## []中,前后都需要空格 if [ $a -eq $b ] then echo "$a -eq $b : a 等于 b" else echo "$a -eq $b: a 不等于 b" fi #3.逻辑运算符 if [ 1 -lt 3 ] && [ 2 -lt 3 ]; then echo "ok" fi
6.echo、printf、test命令
1>echo
echo -e "OK! \n" # -e 开启转义,\n 显示换行 echo -e "OK! \c" # -e 开启转义 \c 不换行 echo `date` #显示命令执行结果 #注意: 这里使用的是反引号 `, 而不是单引号 '。 #结果为:Thu Jul 24 10:08:46 CST 2014
2>printf
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg printf "%-10s %-8s %-4.2f\n" 张三 男 66.1234 printf "%-10s %-8s %-4.2f\n" 李四 男 48.6543
注意:
%s %d %f都是格式替换符
-10s:指的是一个宽度为10的字符(-表示左对齐,没有则表示右对齐),任何字符都会填充在这10个字符内,如果不足则使用空格自动填充
-4.2f:指的是格式化为小数,其中.2表示保留小数点后两位
3>test
#1.数值测试 num1=100 num2=100 if test $[num1] -eq $[num2] then echo '两个数相等!' else echo '两个数不相等!' fi #2.字符串测试 num1="hello" num2="hello11" if test $num1 = $num2 then echo '两个字符串相等!' else echo '两个字符串不相等!' fi #3.文件测试 cd /bin if test -e ./bash then echo '文件已存在!' else echo '文件不存在!' fi
test命令用来监测某个条件是否成立,他可以进行数值,字符和文件的监测
7.shell中的流程控制语句
7.1分支语句
if,case
代码演示:
#if语句 #单分支 if [ 1 -lt 3 ] && [ 2 -lt 3 ]; then echo "ok" fi #双分支 num1=$[2*3] num2=$[1+5] #if else语句经常与test命令结合使用 if test $[num1] -eq $[num2] then echo '两个数字相等!' else echo '两个数字不相等!' fi #多分支 a=10 b=20 if [ $a == $b ] then echo "a 等于 b" elif [ $a -gt $b ] then echo "a 大于 b" elif [ $a -lt $b ] then echo "a 小于 b" else echo "没有符合的条件" fi #case语句 echo '输入 1 到 4 之间的数字:' echo '你输入的数字为:' read aNum case $aNum in 1) echo '你选择了 1' ;; 2) echo '你选择了 2' ;; 3) echo '你选择了 3' ;; 4) echo '你选择了 4' ;; *) echo '你没有输入 1 到 4 之间的数字' ;; esac
7.2循环语句
for while until
代码演示:
#for语句 #需求:顺序输出当前列表中的数字 for num in 1 2 3 4 5 do echo "The value is: $num" done #需求:顺序输出字符串中的字符 for str in 'This is a string' do echo $str done #需求:遍历数组中的所有元素 a=(1 2 3) for x in ${a[*]} do echo $x done #while语句 #需求:输出数字1到5 int=1 while(( $int<=5 )) do echo $int let int++ done #需求:求1~10之间所有整数的和 i=1 sum=0 while [ $i -le 10 ] do sum=$[$sum+$i] i=$[$i+1] done echo $sum #until语句 i=1 until [ $i -gt 10 ] do echo $i ((i++)) done
8.函数
代码演示:
#无参无返回值 #定义函数 demo() { echo 'hello world' } #调用函数 demo #有返回值 funWithReturn(){ echo "输入第一个数字: " read aNum echo "输入第二个数字: " read anotherNum return $(($aNum+$anotherNum)) } funWithReturn echo $? # $? 表示函数的返回值 #有参有返回值 arg() { echo $1 #第一个参数 echo $2 #第二个参数 echo $# #参数个数 echo $* #用字符串的形式,显示所有参数 return 123 #只能返回数字,并且取值是0~255 } arg 1 2 echo $?
网友评论