Shell编程笔记
#!/bin/bash
echo "Hello World !"
1、作为可执行程序
将上面的代码保存为 test.sh,并 cd 到相应目录:
chmod u+x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
2、作为解释器参数
这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:
/bin/sh test.sh
/bin/php test.php
使用变量
your_name="qinjx" echo $your_name echo ${your_name}
echo "I am good at ${your_name}Script"
readonly修饰为只读
unset 命令可以删除变量 unset variable_name
shell不支持浮点数,小数运算示例如下
1、借助bc处理示例:计算5.01-4*2.0,得到的结果为-2.99
1
2
|
$ c=$( echo "5.01-4*2.0" | bc ) $ echo $c |
2、借助awk处理示例:计算7.01*5-4.01,得到的结果为31.05
1
2
|
$ c=$(awk 'BEGIN{print 7.01*5-4.01 }' ) $ echo $c |
注:在shell 中$() 与 ``等效。 中间包含命令语句执行,返回执行结果。
单引号字符串的限制:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
双引号的优点:
- 双引号里可以有变量
- 双引号里可以出现转义字符
拼接字符串
your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
获取字符串长度用#
string="abcd"
echo ${#string} #输出 4
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo
string="runoob is a great company"
echo `expr index "$string" is` # 查找is,输出 8。脚本中 "`" 是反引号,而不是单引号 "'"
数组
array_name=(value0 value1 value2 value3)
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
读取数组的值
valuen=${array_name[n]}
使用@符号可以获取数组中的所有元素,例如:
echo ${array_name[@]}
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
截取字符串
1. # 号截取,删除左边字符,保留右边字符。 echo ${var#*//} 其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符 即删除 http:// 结果是 :www.aaa.com/123.htm 2. ## 号截取,删除左边字符,保留右边字符。 echo ${var##*/} ##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符 即删除 http://www.aaa.com/ 结果是 123.htm 3. %号截取,删除右边字符,保留左边字符 echo ${var%/*} %/* 表示从右边开始,删除第一个 / 号及右边的字符 结果是:http://www.aaa.com 4. %% 号截取,删除右边字符,保留左边字符 echo ${var%%/*} %%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符 结果是:http: 5. 从左边第几个字符开始,及字符的个数 echo ${var:0:5} 其中的 0 表示左边第一个字符开始,5 表示字符的总个数。 结果是:http:
printf
格式化输出
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
%s %c %d %f都是格式替代符
%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),
%-4.2f 指格式化为小数,其中.2指保留2位小数。
# 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
printf %s abc def
printf "%s\n" abc def
printf "%s %s %s\n" a b c d e f g h i j
流程控制
if condition1 then command1 elif condition2 then command2 else commandN fi
文件包含
#使用 . 号来引用test1.sh 文件 . ./test1.sh # 或者使用以下包含文件代码 # source ./test1.sh