本文共 4668 字,大约阅读时间需要 15 分钟。
Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务
Shell 脚本(shell script),是一种为shell编写的脚本程序。业界所说的shell通常都是指shell脚本,但读者朋友要知道,shell和shell script是两个不同的概念。由于习惯的原因,简洁起见,本文出现的"shell编程"都是指shell脚本编程,不是指开发shell自身。
文件内容:
#!/bin/bashecho "Hello World !"
执行过程:
# 创建helloworld.sh文件[mazaiting@localhost shell]$ vim helloworld.sh# 第一种运行方法:作为解释器参数[mazaiting@localhost shell]$ /bin/sh helloworld.sh Hello World!# 第一种运行方法:作为可执行程序[mazaiting@localhost shell]$ ./helloworld.sh# 权限拒绝bash: ./helloworld.sh: Permission denied# 修改文件权限[mazaiting@localhost shell]$ chmod +x ./helloworld.sh # 执行[mazaiting@localhost shell]$ ./helloworld.shHello World!
test1.sh文件内容:
#!/bin/bash# 定义变量your_name="mazaiting"# 打印变量echo $your_name# 建议使用变量时加上{}echo ${your_name} # 重新为变量赋值your_name="tom"# 重新打印变量的值echo ${your_name}
执行过程:
str='this is a string'
your_name='qinjx'str="Hello, I know your are \"$your_name\"! \n"
I. 拼接字符串
your_name="qinjx"greeting="hello, "$your_name" !"greeting_1="hello, ${your_name} !"echo $greeting $greeting_1
II. 获取字符串长度
string="abcd"echo ${#string} #输出 4
III. 提取子字符串
string="alibaba is a great company"echo ${string:1:4} #输出liba
IV. 查找子字符串
string="alibaba is a great company"echo `expr index "$string" is`
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。
数组名=(值1 值2 ... 值n)
${数组名[下标]}
# 取得数组元素的个数length=${#array_name[@]}# 或者length=${#array_name[*]}# 取得数组单个元素的长度lengthn=${#array_name[n]}
以"#"开头的行就是注释,会被解释器忽略。sh里没有多行注释,只能每一行加一个#号。
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
示例:#!/bin/bashecho "first param: ${0}"echo "second param: ${1}"echo "third param: ${2}"
打印结果:
参数处理 | 说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数。如"1 n"的形式输出所有参数。 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与@"用「"」括起来的情况、以"2" … "$n" 的形式输出所有参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
示例:
#!/bin/bashecho "Shell 传递参数实例!";echo "第一个参数为:$1";echo "参数个数为:$#";echo "传递的参数作为一个字符串显示:$*";
打印结果:
$ chmod +x test.sh $ ./test.sh 1 2 3Shell 传递参数实例!第一个参数为:1参数个数为:3传递的参数作为一个字符串显示:1 2 3
@ 区别:
示例:
#!/bin/bashval=`expr 2 + 2`echo "两数之和为 : $val"
注意使用的是反引号 ` 而不是单引号 '
打印结果:两数之和为 : 4
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
num1=100num2=100if test $[num1] -eq $[num2]then echo '两个数相等!'else echo '两个数不相等!'fi
num1=$[2*3]num2=$[1+5]if test $[num1] -eq $[num2]then echo '两个数字相等!'else echo '两个数字不相等!'fi
for loop in 1 2 3 4 5do echo "The value is: $loop"done
while conditiondo commanddone
while :do commanddone或者while truedo commanddone或者for (( ; ; ))`
echo '输入 1 到 4 之间的数字:'echo '你输入的数字为:'read aNumcase $aNum in 1) echo '你选择了 1' ;; 2) echo '你选择了 2' ;; 3) echo '你选择了 3' ;; 4) echo '你选择了 4' ;; *) echo '你没有输入 1 到 4 之间的数字' ;;esac
#!/bin/bashwhile :do echo -n "输入 1 到 5 之间的数字:" read aNum case $aNum in 1|2|3|4|5) echo "你输入的数字为 $aNum!" ;; *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束" break ;; esacdone
#!/bin/bashwhile :do echo -n "输入 1 到 5 之间的数字: " read aNum case $aNum in 1|2|3|4|5) echo "你输入的数字为 $aNum!" ;; *) echo "你输入的数字不是 1 到 5 之间的!" continue echo "游戏结束" ;; esacdone
case的语法和C family语言差别很大,它需要一个esac(就是case反过来)作为结束标记,每个case分支用右圆括号,用两个分号表示break。
#!/bin/bashdemoFun(){ echo "这是我的第一个 shell 函数!"}echo "-----函数开始执行-----"demoFunecho "-----函数执行完毕-----"
#!/bin/bashfunWithParam(){ echo "第一个参数为 $1 !" echo "第二个参数为 $2 !" echo "第十个参数为 $10 !" echo "第十个参数为 ${10} !" echo "第十一个参数为 ${11} !" echo "参数总数有 $# 个!" echo "作为一个字符串输出所有参数 $* !"}funWithParam 1 2 3 4 5 6 7 8 9 34 73
命令 | 说明 |
---|---|
command > file | 将输出重定向到 file。 |
command < file | 将输入重定向到 file。 |
command >> file | 将输出以追加的方式重定向到 file。 |
n > file | 将文件描述符为 n 的文件重定向到 file。 |
n >> file | 将文件描述符为 n 的文件以追加的方式重定向到 file。 |
n >& m | 将输出文件 m 和 n 合并。 |
n <& m | 将输入文件 m 和 n 合并。 |
<< tag | 将开始标记 tag 和结束标记 tag 之间的内容作为输入。 |
需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
. filename # 注意点号(.)和文件名中间有一空格或source filename
转载地址:http://yzvra.baihongyu.com/