shell学习

shell的优势在于处理操作系统底层的业务,php、python优势在于开发运维工具、web业务的开发
脚本开头 #!/bin/sh 或 #!/bin/bash 指定脚本的解释器 “#!”被称为幻数

环境变量:
1、用于定义shell的运行环境,保证shell命令的正确执行
2、查看系统环境变量(全局变量)env 或 set,   设置环境变量 export OLD=36,取消环境变量 unset OLD
3、环境变量可以在命令行中设置,但用户退出时这些变量值丢失,因此最好在用户的家目录下的.bash_profile文件或全局配置/etc/bashrc,/etc/profile 文件或者/etc/profile.d/ (目录下登录后显示加载的脚本)中定义。
4、规范上所有环境变量均为大写

局部变量:
普通字符串变量定义    变量名=value (value一般为简单连续的数字、字符串、路径名等)  变量名='value'  (原样输出单引号里内容,即使内容中有已定义的变量也会把变量名原样输出。一般用于定义显示字符串)                变量名 ="value"  (输出变量时引号里的变量及命令会经过解析后输出该变量内容)
习惯:数字不加引号,其他默认加双引号
命令变量定义      变量名=` `    变量名=$()
shell变量名定义要求:一般是字母、数字、下划线组成,字母开头。
自定义变量建议:
1、内容纯数字(不带空格),定义方式可以不加引号
2、字符串定义一般用双引号定义,特别是多个字符串中间有空格时
3、变量内容需要原样输出时,要用单引号
grep 、awk、sed 取变量
grep "$OLD" grep.log      awk 'BEGIN {print "$OLD"}'      sed -n /"$OLD"/p grep.log
4、变量定义引用  $变量  或  ${变量}
位置变量:
$0 获取当前执行的shell脚本的文件名,如果执行脚本带路径则包括脚本路径   dirname $0 文件路径      basename$0 文件名
$n 获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0是表示脚本的文件名,如果n大于9,大括号括起来${10}
$#  获取执行当前shell脚本时命令行中所传的参数的总个数
$* 获取当前执行的shell脚本所有传参的参数,将所有的参数视为单个字符串,相当于”$1$2$3...“
$@ 把参数当成单个个体 "$1" "$2" "$3". . .
wad82:~/jiny_li # set -- "I am" handsome boy
wad82:~/jiny_li # echo $#
3
wad82:~/jiny_li # for i in "$*";do echo $i;done
I am handsome boy
wad82:~/jiny_li # for i in "$@";do echo $i;done
I am
handsome
boy
进程状态变量:
$$ 获取当前shell的进程号(PID)
$! 执行上一个指令的PID
$_ 在此之前执行的命令或脚本的最后一个参数
$? 获取执行上一个指令的返回值(0为成功,非零为失败)
变量的数值计算:
常用命令:(())、let、expr、bc、$[]        其中bc可用于计算小数,其他都是计算整数
&&   逻辑的and(make && make install)                    ||    逻辑的or                 ?: 条件表达式
=   +=    -=     *=     /=     %=      &=    ^=     赋值运算符                           ** 幂运算   (2**3是8)     % 取余
比较:<  >   == 如果为真就是1,为假就是0

小知识:
-ne不等    -qe 相等    -lt 小于  -gt 大于               脚本中的退出 exit 1 相当于将1赋值给当前shell的$?     函数用return 0  (控制命令和脚本返回值)    shift 参数前移  
         ${string:2:2} 取子串 ($string|cut -c 3-4)   ${string/substring/replace}替换               
wad82:~/jiny_li # string="I am boy"                           
wad82:~/jiny_li # echo ${#string}              ¬    ${#string}取字符串长度($string|wc -L)                      
8                                                                                
wad82:~/jiny_li # echo $string|wc -L   ¬  ${#string}取字符串长度($string|wc -L) expr length "$chars"  
8
wad82:~/jiny_li # string=abcABC123ABCabc
wad82:~/jiny_li # echo ${string#a*C}                     ¬    ${string/#substring}最短匹配删除
123ABCabc
wad82:~/jiny_li # echo ${string##a*C}                ¬    ${string/##substring}最长匹配删除
abc
wad82:~/jiny_li # echo ${string/#abc/hij}             ¬   ${string/#substring/replace} 如果$string前缀匹配$substring,就用$replace来代替匹配$substring
hijABC123ABCabc
wad82:~/jiny_li # echo ${string/%abc/hij}           ¬    ${string/%substring/replace} 如果$string后缀匹配$substring,就用$replace来代替匹配$substring
abcABC123ABChij

string=${value-http}如果value没值就将http给string

let i=i+8 等同于 ((i=i+8)),但后者效率更高          &>/dev/null等同于 >/dev/null 2&1
expr用法:运算符及计算的数字左右都有至少一个空格   expr 2 \* 3       expr $[ 2 * 3]  
  判断文件扩展名 if expr "$1" : ".*\.pub" &>/dev/null  then ....   else ...  fi
  判断整数 expr $a + 0 &>.dev/null  if [ $? -eq 0 ] then ...  else  ... fi                   while true   do read -p "Pls input:" a  expr $a + 0 >/dev/null 2>&1  [ $? -eq 0 ] && echo int || echo chars done
echo `seq -s '+' 10`=`seq -s '+' 10|bc`                                            echo `seq -s '+' 10`=`seq -s " + " 10|xargs expr`
交互式赋值:read -t 10 -p "Please input:" a b
取变量用$,赋值时不需$

-d :判断制定的是否为目录                                       -a 与    -o  或      !  非
-z:判断制定的变量是否存在值
-f:判断制定的是否为文件
-L:判断制定的是否为符号链接
-r:判断制定的是否可读
-s:判断存在的对象长度是否为0
-w:判断制定的是否可写
-x:判断存在的对象是否可以执行
!:测试条件的否定符号

例子:
#!/bin/sh
read -p "Pls input two num:" a b
[ -z "$a" ] || [ -z "$b" ] && {
  echo "Pls input two num again."
  exit 1
}

expr $a + 0 &>/dev/null
RETVAL1=$?
expr $b + 0 &>/dev/null
RETVAL2=$?
test $RETVAL1 -eq 0 -a $RETVAL2 -eq 0 || {
  echo "Pls input two "numbers" again."
  exit 2
}
[ $a -lt $b ] && {
  echo "$a < $b"
  exit 0
}
[ $a -gt $b ] && {
  echo "$a > $b"
  exit 0
}
[ $a -eq $b ] && {
  echo "$a = $b"
  exit 0
}

if条件句   
                
if [条件]
 then
   指令
fi

if[条件];then
 指令
fi
特殊写法:if[ -f "$file1" ];then echo 1;fi  相当于 [ -f "$file1" ]&& echo1 
提示:分号相当于命令换行



你可能感兴趣的:(shell学习)