设为首页 收藏本站
查看: 876|回复: 0

Shell编程(/bin/sh和/bin/bash)

[复制链接]
发表于 2015-4-28 11:32:52 | 显示全部楼层 |阅读模式
  保留字符及其含义
  shell变量
  条件测试命令
  表达式
  流程控制
  参考资料
  
  查看ubuntu支持的Shell:




$ cat /etc/shells
  查看当前shell:




$ echo $SHELL
  
  以下是sh Shell脚本编程,也适用于bash,差异之处已说明。
  
  保留字符及其含义
  $ shell变量名的开始,如$var
  | 管道,将标准输出转到下一个命令的标准输入
  # 注释开始
  & 在后台执行一个进程
  ? 匹配一个字符
  * 匹配0到多个字符(与DOS不同,可在文件名中间使用,并且含.)
  $- 使用set及执行时传递给shell的标志位
  $! 最后一个子进程的进程号
  $# 传递给shell script的参数个数
  $* 传递给shell script的参数
  $@ 所有参数,个别的用双引号括起来
  $? 上一个命令的返回代码
  $0 当前shell的名字
  $n (n:1-) 位置参数
  $$ 进程标识号(Process Identifier Number, PID)
  >file 输出重定向
  `command` 命令替换,如 filename=`basename /usr/local/bin/tcsh`
  >>fiile 输出重定向,append
  其他:
  $$dir
  ls > filelist
  ls >> filelist
  wc -l < filelist
  wc -l filelist
  sleep 5; echo 5 seconds reaches; ls -l
  ps ax |egrep inetd
  find / -name core -exec rm {} \; &
  filename=`date "+%Y%m%d"`.log
  
  
  shell变量
  Shell有如下四种变量:
  .用户自定义变量
  .位置变量即 shell script之参数
  .预定义变量(特殊变量)
  .环境变量
  (1)用户自定义变量(数据的存储)




$ COUNT=1
$ NAME="He Binwu"
$ echo $NAME
$ echo ${NAME}
  技巧:因为大部分UNIX命令使用小写字符,因此在shell编程中通常使用全大写变量,当然这并不是强制性的,但使用大写字符可以在编程中方便地识别变量。
  变量的调用:在变量前加$。
  使用unset命令删除变量的赋值。




$ Z=hello
$ echo
$Zhello
$ unset Z
$ echo $Z
$
  在变量未赋值之前其值为空。Bourne Shell允许对变量设置默认值(相当于C#中 ?? 表达式),其格式如下:
  ${variable:-defaultvalue}
  例:




$ echo Hello $UNAME
Hello
$ echo Hello ${UNAME:-there}
Hello there
$ echo $UNAME #变量值并未发生变化
there
$ UNAME=hbwork
$ echo Hello ${UNAME:-there}
Hello hbwork

  另一种情况:改变变量的值,格式如下:
  ${variable:=value}




$ echo Hello $UNAME
Hello
$ echo Hello ${UNAME:=there}
Hello there
$ echo $UNAME #变量值并未发生变化
there
  变量替换中使用命令替换:




echo ${MYDIR} #输出空
echo ${MYDIR:-`pwd`}

输出:

/home/pxl/shelltest
  在变量已赋值时进行替换:




MYTEST=pxl
echo ${MYTEST}
echo ${MYTEST:+"changevalue"}
echo $MYTEST
输出:
pxl
changevalue
pxl

  带有错误检查的有条件变量替换:




echo ${UNAME:?"UNAME has not been set"}
echo ${UNAME} #如果上一句判断错误,这里不会执行



输出:
./test.sh: 17: UNAME: UNAME has not been set

  (2)位置变量(Shell参数)
  在shell script中位置参数可用$1..$9表示,$0表示内容通常为当前执行程序的文件名。
  可以使用shift [n] 来删出指定前n个参数,n默认为1.




脚本test.sh:
shift
shift 2
echo $1
echo $0


执行:
$ ./test.sh a b c d e
输出:
d
./test.sh

  
  
  条件测试命令
  (1)数值测试:
  -eq :等于则为真。
-ne :不等于则为真。
-gt :大于则为真。
-ge :大于等于则为真。
-lt :小于则为真。
-le :小于等于则为真。
  (2)字串测试:
= :等于则为真。
!= :不相等则为真。
-z字串 :字串长度伪则为真。
-n字串 :字串长度不伪则为真。
  (3)文件测试:
-e文件名 :如果文件存在则为真。
-r文件名 :如果文件存在且用户有读权限则为真。
-w文件名 :如果文件存在且用户有写权限则为真。
-x文件名 :如果文件存在且用户有可执权限行则为真。
-s文件名 :如果文件存在且至少有一个字符(大小不为零)则为真。
-d文件名 :如果文件存在且为目录则为真。
-f文件名 :如果文件存在且为普通文件则为真。
-c文件名 :如果文件存在且为字符设备文件则为真。
-b文件名 :如果文件存在且为块设备文件则为真。
  
  
  表达式
  (1) 与、或、非
  && :与
  || :或
  !  : 非(需要有空格)
  (2) expr命令
  expr命令一般用于整数值,但也可用于字符串。一般格式为:
expr argument operator argument

  其中operator为+ - * / %, 但对*的使用要用转义符\。




v1=3
v2=2
v3=`expr $v1 \* $v2`
echo $v3


输出:
6
  




#适用于/bin/bash,不适用于/bin/sh
v1=3
v2=2
v3=$[v1*v2]
echo $v3

  
  
  流程控制
  (1) if 条件语句




if [ -f "$file" ] ; then
      newfile=`echo "$file" | sed "s/${OLD}/${NEW}/g"`
      if [ -f "$newfile" ]; then
       echo "ERROR: $newfile exists already"
      else
         echo "renaming $file to $newfile ..."
         mv "$file" "$newfile"
      fi
fi
  
  (2) for 循环




for file in $*; do
   if [ -f "$file" ] ; then
      newfile=`echo "$file" | sed "s/${OLD}/${NEW}/g"`
      if [ -f "$newfile" ]; then
       echo "ERROR: $newfile exists already"
      else
         echo "renaming $file to $newfile ..."
         mv "$file" "$newfile"
      fi
   fi
done
  




for n in 9 8 7 6 5 4 3 2 1; do
   if [ -f "$filen.$n" ]; then
      p=`expr $n + 1`
      echo "mv $filen.$n $filen.$p"
      mv $filen.$n $filen.$p
   fi
done
  




#适用于/bin/bash,不适用于sh
for((i=1;i shift by 2
   --) shift;break;; # end of options
   -*) echo "error: no such option $1. -h for help";exit 1;;
   *) break;;
esac
done
  
  
  参考资料
  Shell编程基础
  shell编程简介

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-61530-1-1.html 上篇帖子: 微软计划推出Visual Studio Shell欲与Eclipse一争高下,响应开源之风 下篇帖子: [整理]Shell常用命令
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表