Shell编程
这里说的Shell 脚本(shell script),是在Linux 环境下运行的脚本程序
Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
Linux 的 Shell 种类众多,常见的有:
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
……
Shell脚本的执行方式
1. 脚本中的内容必须以 #!/bin/bash 开头
这句话的意思是告诉执行器需要调用 /bin/bash 来执行这个脚本文件。
这也是在Shell中唯一以 # 号开头却不代表注释的语句,脚本文件中的其他任何地方以 # 号开头的语句都会被认为是注释语句而忽略执行,所以这句话只能写在Shell的开头才有效。
2. 脚本需要有可执行权限
2.1 方式一:可以先赋予脚本 +x 权限,再执行脚本
2.2 方式二:不用赋予权限,通过 sh 脚本文件 的方式直接执行脚本
运行Shell脚本
vi test.sh
#!/bin/bash
echo "Hello World !"
运行 Shell 脚本有两种方法:
1、作为可执行程序
chmod +x ./test.sh
./test.sh
2、作为解释器参数
/bin/sh test.sh
编写一个快捷创建shell脚本的命令
#!/bin/bash
if test -z $1;then
newfile="./script_`date +%m%d_%s`"
else
newfile=$1
fi
echo $newfile
if ! grep "^#!" $newfile &>/dev/null; then
cat >> $newfile << EOF
#!/bin/bash
# Author:
# Date & Time: `date +"%F %T"`
#Description:
EOF
fi
vim +5 $newfile
chmod +x $newfile
shell脚本的调试
sh -x script.sh #可以查看shell脚本的运行状况,适用于所有脚本
vim script.sh #shell脚本必须拥有x权限
#!/bin/bash -x #可以检测shell脚本的运行状况,在我的desktop虚拟机上,此版本不能使用
vim test.sh #编辑tset.sh脚本文件
将以上内容编写好之后保存为shell文件,然后执行
chmod u+x shell
sudo mv shell /usr/bin/
echo命令
echo输出命令,顾名思义就是输出字符提示的意思
命令格式如下:
echo 【选项】 【输出内容】
选项:-e:支持反斜线控制的字符转换,前面有斜线的字符将作为转义字符
常用的转义字符:
\b 转义后相当于按退格键(backspace) ,但前提是”\b”后面存在字符,具体效果参考下方示例。
\c 不换行输出,在”\c”后面不存在字符的情况下,作用相当于echo -n,具体效果参考下方示例。
\n 换行,效果看示例。
\f 换行,但是换行后的新行的开头位置连接着上一行的行尾,具体效果查看示例;
\v 与\f相同;
\t 转以后表示插入tab,即制表符,已经在上面举过例子;
\r 光标移至行首,但不换行,相当于使用”\r”以后的字符覆盖”\r”之前同等长度的字符,只看这段文字描述的话可能不容易理解,具体效果查看示例;
\ 表示插入”\”本身;
Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。命令格式:
echo string
显示字符串
echo "It is a test"
显示转义字符:
echo "\"It is a test\""
printf 命令
printf 命令的语法:
printf format-string [arguments...]
Shell 注释
以 # 开头的行就是注释,会被解释器忽略
Shell变量
定义变量
变量名的命名须遵循如下规则:
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
使用变量
在变量名前面加美元符号即可
删除变量
使用 unset 命令可以删除变量,但不能删除只读变量
Shell 函数
shell函数的本质是一段可以重复使用的脚本代码,这段代码被提前编写好,放在指定位置,使用时直接调用即可。
shell中的函数和C++、JAVA、Python等其他编程语言中的函数类似,只是在语法中有所差别。
function name() {
statements
[return value]
}
对各个部分的说明:
function是shell中的关键字,专门用来定义函数;
name是函数名;
statements是函数要执行的代码,也就是一组语句;
return value表示函数的返回值,此处用方括号括起来表示这部分可以写也可以不写;
由{ }包围的部分称为函数体,调用一个函数,实际上就是执行函数体中的代码
函数的调用
调用shell函数时可以给他传递参数,也可以不传递。
不传递参数时,直接给出函数名即可:
name
如果要传递参数,多个参数之间以空格分开:
name param1 param2 param3
如
#!/bin/bash
#定义函数
function url() {
echo "www.baidu.com"
}
#函数的调用
url
函数的参数
和其他编程语言不同的是,shell函数在定义时不能指明参数,但在调用时却可以传递参数,并且给它传递什么参数它就接收什么参数
运算符(例子直接展示)
#!/bin/bash
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ]
then
echo "a 等于 b"
fi
if [ $a != $b ]
then
echo "a 不等于 b"
fi
结果
a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a 不等于 b
创建库
在一个脚本当中建立多个函数,用于别的脚本来调用该库中的函数
[root@localhost ~]vim 3.sh
jiafa() {
echo $[$1 + $2]
}
chengfa() {
echo $[$1 * $2]
}
jianfa() {
echo $[$1 - $2]
}
chufa() {
if [ $2 -ne 0 ];then
echo $[$1 / $2]
else
echo "$2不能为0"
fi
}
调用
[root@localhost ~]#vim 4.sh
#!/bin/bash
. /root/3.sh
read -p "输入第一个参数值:" first
read -p "输入第二个参数值:" second
result1=`jiafa $first $second`
result3=$(chengfa $first $second)
result2=`jianfa $first $second`
result4=$(chufa $first $second)
echo $result1
echo $result2
echo $result3
echo $result4