Shell编程
- Linux高级、虚拟机、Linux命令、JDK&MYSQL安装
- Shell编程、Shell脚本综合(JDK脚本安装、数据库定时备份脚本)
- 集群环境准备
- 解释型语言,不需要编译
- shell的数据类型:字符串和整型
- 定义变量username="znyoung" #不能使用空格,最好用双引号 - 访问变量echo "${username}" #最好用双引号,防止有空格 - 变量的其他赋值方式#!/bin/bashecho "who are you?"read name #从键盘获取变量的值pwd_string=$(pwd) #将当前的绝对路径赋值给pwd_string变量date_string=`date` #将当前时间赋值给date_string变量,注意这里使用的是反引号echo "hello, $name"echo $pwd_stringecho $date_string - 只读变量#!/bin/bashmyUrl="http://www.google.com"readonly myUrlmyUrl="http://www.runoob.com" - 删除变量#!/bin/shmyUrl="http://www.runoob.com"unset myUrlecho $myUrlenv #查看所有的系统变量echo $PATH #输出环境变量PATH
export 变量名=变量值 #在/etc/profile后面追加- 执行shell脚本时,向脚本传递参数,可以用特殊变量来获取这些参数,以下示例:
#!/bin/bashecho "Shell 传递参数实例!";echo "执行的文件名:$0";echo "第一个参数为:$1";echo "第二个参数为:$2";echo "第三个参数为:$3";echo "参数个数为:$#";echo "传递的参数作为一个字符串显示*:$*";./test5.sh aaa bbb ccc #执行脚本#执行结果Shell 传递参数实例!执行的文件名:./demo4.sh第一个参数为:aaa第二个参数为:bbb第三个参数为:ccc参数个数为:3传递的参数作为一个字符串显示*:aaa bbb ccc- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的,单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
- 双引号里可以有变量
- 双引号里可以出现转义字符
- 双引号随便拼,可拼转义
#!/bin/bashyourname="maizy"wenhou_1="你好,$yourname ."wenhou_2="你好,"$yourname" ."wenhou_3="你好,\"$yourname\" ."echo $wenhou_1 $wenhou_2 $wenhou_3
你好,maizy . 你好,maizy . 你好,"maizy" . #输出结果- 单引号
#!/bin/bashyourname="乔布斯"wenhou_4='你好,$yourname.'wenhou_5='你好,'$yourname.''wenhou_6='你好,"$yourname" .'echo $wenhou_3 $wenhou_4 $wenhou_5
你好,$yourname. 你好,乔布斯. 你好,"$yourname" . #输出结果获取字符串长度
Section titled “获取字符串长度”#!/bin/bashstring="jobs"echo ${string} # jobsecho ${#string} # 4#!/bin/bashstring="截取字符串"echo ${string:2,2} #字符#表达式和算数运算符之间要有空格,完整的表达式要被``包含#乘法运算需要加转义符\*val=`expr 2 + 2`echo $val
#!/bin/basha=4b=20#加法运算echo `expr $a + $b`#减法运算echo `expr $a - $b`#乘法运算,注意*号前面需要反斜杠echo `expr $a \* $b`#除法运算echo `expr $a / $b`#此外,还可以通过$(())、$[]进行算术运算。echo "a = $a"c=$((a+b))d=$[a+b]echo "c = $c"echo "d = $d"| 运算符 | 说明 | | --- | --- | | -eq | 检测两个数是否相等,相等返回 true。 | | -ne | 检测两个数是否不相等,不相等返回 true。 | | -gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | | -lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | | -ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 | | -le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 |
| 判断符 | 说明 | | --- | --- | | -n STRING | 字符串长度不为零 | | -z STRING | 字符串长度为0 | | = | 判断两个字符串是否一样 | | != | 判断两个字符串是否不一样 |
| 判断符 | 说明 | | --- | --- | | -f | 存在且是普通文件 | | -d | 存在且是目录 | | -h | 存在且是符号链接 | | -e | 文件存在 | | –r | 文件存在并且可读 | | –w | 文件存在并且可写 | | –x | 文件存在并且可执行 |
#判断当前系统是否有多个ssh进程#!/bin/bash
if [ $(ps -ef|grep -c "ssh") -gt > 1 ]then echo="true"fi
#判断文件是否存在,不存在则创建#!/bin/bash
filePath="/export/shell"if [ ! -e $filePath ]then mkdir $filePathfiif elif else
Section titled “if elif else”#判断是否成年
#!/bin/bash
read -p "please enter your age:" ageif [ $age -lt 18 ]then echo "您未成年"elif [ $age -gt 18]then echo "您已经成年"else echo "您刚好成年”fifor 变量 in 值1 值2 值3…do程序done
#打印/root目录下所有的文件#!/bin/bash
for fileName in $(ls /root)do echo $fileNamedone#与java、js类似for ((初始值;循环控制条件;变量变化))do程序done
#!/bin/bashs=0#从1加到100for(( i=1;i<=100;i=i+1))#定义循环100次do #每次循环给变量s赋值 s=$(($s+$i)) #第一种方式 s1=`expr $s + $i` #第二种方式 let s2+=i #第三种方式done#输出从1加到100的和echo "The sum of 1+2+..+100 is : $s"while循环
Section titled “while循环”while 条件do 程序done#1while :do commanddone#2while truedo commanddone#3for (( ; ; ))case语句
Section titled “case语句”case 值 in模式1) command1 command2 ... commandN ;;模式2) command1 command2 ... commandN ;;esac#!/bin/bashecho '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'read aNumcase $aNum in 1) echo '你选择了 1' ;; 2) echo '你选择了 2' ;; 3) echo '你选择了 3' ;; 4) echo '你选择了 4' ;; *) echo '你没有输入 1 到 4 之间的数字' ;;esacbreak #跳出整个循环continue #跳出当前这个,进行下一个循环#function可省略[ function ] funname(){ action; [return int;]}所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过1表示第一个参数,$2表示第二个参数…
#!/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带有return语句的函数
Section titled “带有return语句的函数”- return返回状态码,并且可以自定义,范围为0-255
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "read aNum
echo "输入第二个数字: "
read anotherNum echo "两个数字分别为 $aNum 和 $anotherNum !"
echo "两个数的和为:$(($aNum+$anotherNum))" return 100}
funWithReturn
echo "退出状态码: $? !"获取函数的运算结果
Section titled “获取函数的运算结果”- 若要获取函数结果的状态码,必须要在执行函数后马上使用$?才能获取调用函数的状态
- 若要获取函数结果,必须使用一个变量来接受结果,否则函数中的echo只是作为输出使用。弱使用了变量来接收结果,则echo为返回的值。
#!/bin/bashfunWithReturn(){ s=0 #求1-n的和,$1为传入的第一个参数 for(( i=1;i<=$1;i=i+1)) do s=$(($s+$i)) done #返回计算结果 echo $s return 0;}#调用函数,并传入参数,求1-100的和#result用户获取函数的返回结果,也就是echo后边的内容result=$(funWithReturn 100)echo "1-$1的和:$result"#状态码为0表示正常退出,非0表示不正常退出(状态码范围:0-255)echo "退出状态码: $? !"- 比较少用,参考资料
select
Section titled “select”select表达式是bash的一种拓展应用,擅长于交互式场合。用户可以从一组不同的值中进行选择
select var in ... ;do commonddone.... now $var can be used ...
#select 是个无限循环,因此要记住用 break 命令退出循环,或用exit 命令终止脚本#!/bin/bashecho "What is your favourite OS?"PS3="Please enter your choice:"select var in "Linux" "Gnu Hurd" "Free BSD" "Other"do break;doneecho "You have selected $var"
#这里PS3作为select语句的shell界面提示符,注意:PS3一定要定义在select语句的前面
#结果What is your favourite OS?1) Linux2) Gnu Hurd3) Free BSD4) OtherPlease enter your choice:3You have selected Free BSD
#!/bin/bashecho "你想学习什么语言?"PS3="请输入你的选择:" # 设置提示字符串select var in java c++ shell pythondo case $var in "java") echo "恭喜你选择成功.java最牛" ;; "c++") echo "驱动开发 网络优化 go 语言" ;; "shell") echo "运维必会" ;; python) echo "人工智能" esac break # 如果这里没有break 将会进行无限循环doneecho "你选择的是:$var"加载其他文件的变量
Section titled “加载其他文件的变量”和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。
. filename # 注意点号(.)和文件名中间有一空格或source filename定义两个文件 demo1.sh和demo2.sh,在test1中定义一个变量arr=(java c++ shell),在demo2中对arr进行循环打印输出。 第一步: vim demo1.sh
| #!/bin/bash my_arr**=(AA BB CC)** | | --- |
第二步: vim demo2.sh
| #!/bin/bash source **./**test1.sh # 加载test1.sh 的文件内容 for var in var** done | | --- |
第三步: 执行demo2.sh
| sh demo2.sh | | --- |
集群环境准备
Section titled “集群环境准备”See Doc