shell整理
来源:互联网 发布:js 不等于空字符串 编辑:程序博客网 时间:2024/05/16 11:41
转自http://blog.csdn.net/wzzfeitian/article/details/30995303
基本常识
1.变量命名规则:
- 首字符必须为字母
- 中间不能有空格,可以有下划线_
- 不能使用标点符号
- 不能使用bash里的关键字
2.变量赋值:
变量名=值, (注意,= 两边不能有空格)
var=1var=$var+1echo $var+1输出为1+1,而不是2可以用如下方法使其输出为2let "var+=1"#var=$[$var+1]#var=$(($var+1))echo $var或者var=1var= expr $var + 1 #(注意,+ 两边的空格,一定要有)let表示数学运算,expr用于整数值运算,每一项用空格隔开,$[]将中括号内的表达式作为数学运算先计算结果再输出。在bash中,将数学运算结果赋给某个变量, var=$[ operation ]变量自增,自减let var++ let var--let var+=2echo "10.2-2" | bc -- 小数运算要用bc $[]不支持小数
3.变量使用
$var ${var}
” ” 中可以用$var ,\”
’ ’ 中不可以用$var \”
$(cmd) 与 `cmd` 等效
内建变量
- $RANDOM 随机数
- 字段分隔符 IFS=$’\n’
- $0 程序名 ,$1 … $9 是命令行参数
多于9个命令行参数的话,后面的需要${10} ${11}这种格式 - $# 表示传入的命令行参数的个数。在{}中使用$#时,要改用 ${!#}
- $* 所有命令行参数当成一个单词存储
- $@ 所有命令行参数当成一个字符串中的多个单词
- $$ 脚本的PID
条件变量替换
Bash Shell可以进行变量的条件替换,既只有某种条件发生时才进行替换,替换条件放在{}中.
- ${value:-word}
当变量未定义或者值为空时,返回值为word的内容,否则返回变量的值. - ${value:=word}
与前者类似,只是若变量未定义或者值为空时,在返回word的值的同时将 word赋值给value - ${value:?message}
若变量已赋值的话,正常替换.否则将消息message送到标准错误输出若此替换出现在Shell程序中,那么该程序将终止运行. - ${value:+word}
若变量已赋值的话,其值才用word替换,否则不进行任何替换 - ${value:offset}
${value:offset:length} 从变量中提取子串,这里offset和length可以是算术表达式. - ${#value}
变量的字符个数 - ${value#pattern}
${value##pattern}
去掉value中与pattern相匹配的部分,条件是value的开头与pattern相匹配
#与##的区别在于一个是最短匹配模式,一个是最长匹配模式. - ${value%pattern}
${value%%pattern}
与7.类似,只是是从value的尾部于pattern相匹配,%与%%的区别与#与##一样 - ${value/pattern/string}
${value//pattern/string}
进行变量内容的替换,把与pattern匹配的部分替换为string的内容,/与//的区别与上同
注意: 上述条件变量替换中,除2.外,其余均不影响变量本身的值
4.比较运算符
- 文件比较运算符
-e filename 如果 filename 存在,则为真 [ -e /var/log/syslog ]-d filename 如果 filename 为目录,则为真 [ -d /tmp/mydir ]-f filename 如果 filename 为常规文件,则为真 [ -f /usr/bin/grep ]-L filename 如果 filename 为符号链接,则为真 [ -L /usr/bin/grep ]-r filename 如果 filename 可读,则为真 [ -r /var/log/syslog ]-w filename 如果 filename 可写,则为真 [ -w /var/mytmp.txt ]-x filename 如果 filename 可执行,则为真 [ -L /usr/bin/grep ]filename1 -nt filename2 如果 filename1 比 filename2 新,则为真 [ /tmp/install/etc/services -nt /etc/services ]filename1 -ot filename2 如果 filename1 比 filename2 旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]
- 字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)
-z string 如果 string 长度为零,则为真 [ -z "$myvar" ]-n string 如果 string 长度非零,则为真 [ -n "$myvar" ]string1 = string2 如果 string1 与 string2 相同,则为真 [ "$myvar" = "one two three" ]string1 != string2 如果 string1 与 string2 不同,则为真 [ "$myvar" != "one two three" ]
- 算术比较运算符
num1 -eq num2 等于 [ 3 -eq $mynum ]num1 -ne num2 不等于 [ 3 -ne $mynum ]num1 -lt num2 小于 [ 3 -lt $mynum ]num1 -le num2 小于或等于 [ 3 -le $mynum ]num1 -gt num2 大于 [ 3 -gt $mynum ]num1 -ge num2 大于或等于 [ 3 -ge $mynum ]
5.结构语句
if commandthen commandsfiif command; then #如果then与if在同一行,if command后要加';' commandsfiif commandthen commandselse commandsfiif command1then commandselif command2then commandsfiif test conditionif [ condition ] 注意[]与condition之间的空格,> < 需要转义then commandsfiif ((expression)) > < 不需要转义then commandsfiif [[condition]] 可以用正则表达式then commandsficase variable inpattern1 | pattern2) commands1 ;;pattern3) commands2:: ;;*) default commands ;;esacfor var in listdo commandsdonewhile test commanddo other commandsdoneuntil test commanddo other commandsdonebreak n (default 1) 跳出n层循环continue n (default 1) 继续n级循环select var in listdo commandsdone
6.函数
语法
[ function ] funname [()]{ action; [return int;]}说明:1. 可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。2. 参数返回,可以显式return返回,return后跟数值n(0-255);如果不加,将以最后一条命令运行结果,作为返回值。
注意事项
- 必须在调用函数地方之前,声明函数,shell脚本是逐行运行。不会像其它语言一样先预编译。因此必须在使用函数前先声明函数。
- total=$(func 3 2); 通过这种调用方法,我们清楚知道,在shell 中 单括号里面,可以是:命令语句。 因此,我们可以将shell中函数,看作是定义一个新的命令,它是命令,因此 各个输入参数直接用 空格分隔。 一次,命令里面获得参数方法可以通过:$0…$n得到。 $0代表函数本身。
- 函数返回值,只能通过$? 系统变量获得,直接通过=,获得是空值。其实,我们按照上面一条理解,知道函数是一个命令,在shell获得命令返回值,都需要通过$?获得。
- 需要获得函数值:通过$?获得
- 如果需要传出其它类型函数值,可以在函数调用之前,定义变量(这个就是全局变量)。在函数内部就可以直接修改,然后在执行函数就可以读出修改过的值
- 如果需要定义自己变量,可以在函数中定义:local 变量=值 ,这时变量就是内部变量,它的修改,不会影响函数外部相同变量的值.
shell调试模式:
- bash -x my_script
可以让bash打印出你脚本执行的过程中的所有语句
每一行前加上文件的行号,这会非常有用。要做到这样,你只需要设置下面的环境变量:export PS4='+${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]}: '
- 调试部份的脚本 (注意:我们在运行脚本的时候,不需要使用bash -x了)
有些时候,你并不想调试整个脚本,你只要调试其中的一部份,那么,你可以在你想要调试的脚本之前,调用“set -x”,结束的时候调用“set +x”就可以了 - bash -n my_script
只检查语法,不执行脚本的模式 - log一些感兴趣的特定的信息
使用log前,我们先写一个函数:
_log() { if [ "$_DEBUG" == "true" ]; then echo 1>&2 "$@" fi}可以在脚本中调用 _log "log msg"如果不设置_DEBUG=true, LOG信息就不会打印出来
- 使用脚本调试器,bashdb,开源的。
常用命令
路径分割
dirname 获取文件夹
basename 获取文件名生成数字序列
seq start end
seq start offset end字符串截取
- expr substr $var1 起始位置 截取长度 起始位置从1开始 对”“引用的string处理有点问题
- ${}: ${var:起始位置:截取长度} 起始位置从0开始,建议用这种
字符串替换
${var/old/new} 替换第一个匹配的old为new
${var//old/new} 替换所有匹配的old为newcron时间表的格式
min hour dayofmonth dayofweek command
crontab -l 列出已有的cron时间表
crontab -e 添加cron时间表事件
cron目录, hourly daily monthly weekly
/etc/cron.*ly
0 0
- shell整理
- shell 整理
- shell整理
- shell整理
- shell 编程汇总整理
- shell 概述(转载+整理)
- Shell命令行操作--整理
- Shell常用命令整理
- shell正则表达式整理
- shell基础整理
- shell基础整理
- 整理shell基础
- shell 基础整理
- shell 特殊变量 整理
- shell学习整理
- Linux Shell编程整理
- shell常用命令整理
- shell 资源整理
- WPF学习笔记:ComboBox的数据绑定
- 交叉编译directfb - Cross compile directfb
- freelancer 语源
- jackson处理json对象
- Spring MVC 学习笔记 json格式的输入和输出
- shell整理
- Oracle学习(十三):闪回
- 抽象工厂模式 (C语言实现)
- struts2零配置(2)
- 如何将图片,声音,影像等文件读入字节数组中
- linxu find 命令 搜索字符串
- Python学习之路——强力推荐的Python学习资料
- 由吃饭想到的产品痛点问题
- [剑指offer]求字符的所有组合