面对现实,超越自己
逆水行舟,不进则退
posts - 269,comments - 32,trackbacks - 0

1$表示普通用户,#表示超级用户(root user)。超级用户是Linux系统中权限最高的用户。

2shell通常以#!起始,例如:#!/bin/bash

3、运行脚本的两种方式:1、将脚本作为sh的命令行参数。2、将脚本作为具有执行权限的可执行文件。

          例如:$ sh script.sh Or $ sh /home/path/script.sh

          注:如果将脚本作为sh的命令行参数运行,那脚本中#!就没什么用处了。

          脚本的可执行权限可以通过以下方式设置:$ chmod a+x script.sh    执行:./script.sh  #当前目录下  $ /home/path/script.sh #使用脚本完整路径

4、在bash中每个命令或是命令序列式通过使用分号或换行符来分隔的。例如: $ cmd1;cmd2  等同于   $ cmd1   $ cmd2

5echo用于终端打印的基本命令,在echo 的双引号形式中打印!需要用转义字符/!转义。

6、可以用printf输出,格式与C相同。

7echo中可以用 -n忽略结尾的换行符,如果需要使用转义序列,则采用 echo -e"包含转义序列的字符串"这种形式。

8、打印色彩输出, \e[1;31 将颜色设置为红色,\e[0m 将颜色重新置回,例如: echo -e "\e[1;31m This is red txt \e[0m"

9、设置背景,例如:echo -e "\e[1;42m Green Background \e[0m"

10、可以用env命令在终端查看所有于此终端相关的环境变量,对于每个进程,在起运行时的环境变量可以使用下面的命令查看, cat /proc/$PID/environ

      使用pgrep命令获取进程的ID$ pgrep gedit #gedit为进程名称

      替换可以使用tr命令,环境变量之间由null字符(\0)分割,如果将\0替换成\n 如下:$ cat /proc/12501/environ | tr '\0' '\n'

11、设置环境变量,用export,如: HTTP_PROOXY=http://192.168.20.1:134  export HTTP_PROOXY 直接设置:export PATH="$PATH:/home/user/bin"

12、获取字符串的长度:length=${#var}

13、识别当前shell版本:echo $SHELL or echo $0

14、检查是否为超级用户(UID环境变量):if [ $UID -ne 0 ]; then   echo Non root user. Please run as root else echo "Root user" fi

       注:root用户的UID0.

15、数学运算:在Bash shell环境中,可以利用let (())[]执行基本的算术操作,而在进行高级操作时,exprbc这两个工具也会非常有用。

      使用let时,变量名之前不需要再添加$,如:no1=4; no2=5; let result=no1+no2 echo $result

      自加操作:let no1++   自减操作:let no1--

      简写形式:let no+=6  let no-=6

      其他方法:result=$[ no1 + no2 ] result=$[ $no1 + 5]

                    result=$(()no1 + 50)

                    result='expr 3 + 4'

                    result=$(expr $no1 + 5)

      以上这些方法只能用于整数运算,而不支持浮点数。可以借助bc工具执行浮点数运算。

      如:echo "4 * 0.56" | bc

      设定小数精度:echo "scale=2;3/8" | bc

      禁制转换:no=100 echo "obase=2;$no" | bc Result:1100100

                    no=1100100 echo "obase=10;ibase=2;$no" | bc Result:100

      计算平方以及平方根: echo "sqrt(100)" | bc  #Square root

                                   echo "10^10" | bc      #Square

                                                                                                                 

16、重定向

      系统预留的三个标准描述符:stdin(0)stdout(1)stderr(2)

     1> >>的区别

      $echo "hello world" > temp.txt会将temp.txt中的内容先清空,然后再添加hello world

      而如果是 $echo "hello world" > temp.txt 则直接在文本尾部添加。

 

     2)将标准输入、输出以及err 重定向到文件

      比如:cmd 2>stderr.txt 1>stdout.txt

       cmd 2>&1 output.txt cmd &> output.txt

      "&"在这里代表标准输出和标准错误,这里无论是正常输出还是错误信息都写到filename中了。

      重新定义标准输入,输出,和错误的文件标识符

      重新定义文件标识符可以用i>&j命令,表示把文件标识符i重新定向到j,你可以把"&"理解为"取地址"

     3)自定义描述符

      exec 3<input.txt #使用文件描述符3打开并读取文件

      echo hello world >input.txt

      #echo 123456789 >filename   把字符串写到文件filename

      #exec 3<>filename           把文件filename打开,并指定文件标识符为3

      #read -n 4 <&3              从文件中读4个字符,句柄已经指到第四个字符末尾

      #echo -n . >&3              在第5个字符处写一个点,覆盖第5个字符,-n表示不换行

      #exec 3>&-                                        关闭文件标识符3

 

17、数组array_var={0 1 2 3 4 5}   打印数组元素内容:$ echo ${array_var[0]} or  $ index=5  $ echo ${array_var[$index]}

      打印数组中所有值:$ echo ${array_var[*]} or $ echo ${array_var[@]}

      打印数组长度:$ echo ${#array_var[*]}

      列出数组索引:$ echo ${!array_var[*]} or $ echo ${!array_var[@]}

          

18、一步按回车键的方式读取字符“n”:read -n numbers_of_chars variable_name   如:$ read -n 4 var    $ echo $var

      用不回显的方式读取密码:read -s var    显示提示信息:read -p "Enter Input:" var   在特定时限内读取输入:read -t timeout var 

      用定界符结束输入:read -d delim_char var   如:$ read -d ":" var

                  

19、比较符号:-eq 等于   -ne不等于  -gt大于   -lt小于  -ge大于等于   -le小于等于

 

20、字符串比较:[[ $str1 = $str2 ]] 另一种写法:[[ $str1 == $str2 ]]  [[ -z $str1 ]] 空字符串返回真   [[ -n $str1 ]] 非空返回真

 

21$$ shell 本身的PID ;

      $! shell最后运行的后台ProcessPID ;

      $? 最后运行的命令的结束代码(返回值);

      $- 使用set命令设定的flag一览;

      $* 所有参数列表。如"$*"["]括起来的情况、以"$1$2...$n"的形式输出所有参数;

      $@ 所有参数列表。如"$@"["]括起来的情况、以"$1" "$2"..."$n"的形式输出所有参数;

      $# 添加到shell的参数个数

      $0 shell本身的文件名

      $1~$n 添加到shell的各参数值。$1是第1参数、$2是第2参数...

                  

22if语句命令:

                   if 条件

                   then

                     Command

                   else

                     Command

                   fi             别忘了这个结尾

                  

                   if [ -f file ] 如果文件存在

                   if [ -d ... ] 如果目录存在

                   if [ -s file ] 如果文件存在且非空 if [ -r file ] 如果文件存在且可读 if [ -w file ]  如果文件存在且可写 if [ -x file ] 如果文件存在且可执行

        

                   整数变量表达式

                   if [ int1 -eq int2 ] 如果int1等于int2

                   if [ int1 -ne int2 ] 如果不等于  if [ int1 -ge int2 ] 如果>= if [ int1 -gt int2 ] 如果> if [ int1 -le int2 ] 如果<= if [ int1 -lt int2 ]如果<

 

                   字符串变量表达式

                   If [ $a = $b ]   如果string1等于string2 字符串允许使用赋值号做等号 if [ $string1 != $string2 ] 如果string1不等于string2 if [ -n $string ]      

                   如果string 非空(0),返回0(true)  if [ -z $string ] 如果string 为空 if [ $sting ]           如果string 非空,返回0 (-n类似

                   条件表达式引用变量要带$

                  

                   [macg@machome ~]$ man test [(1) User Commands [(1)

                   SYNOPSIS test EXPRESSION [ EXPRESSION ]

                   [-n] STRING the length of STRING is nonzero -n和直接$str都是非0条件

                   -z STRING the length of STRING is zero

                   STRING1 = STRING2 the strings are equal

                   STRING1 != STRING2 the strings are not equal

                   INTEGER1 -eq INTEGER2 INTEGER1 is equal to INTEGER2

                   INTEGER1 -ge INTEGER2 INTEGER1 is greater than or equal to INTEGER2

                   INTEGER1 -gt INTEGER2 INTEGER1 is greater than INTEGER2

                   INTEGER1 -le INTEGER2 INTEGER1 is less than or equal to INTEGER2

                   INTEGER1 -lt INTEGER2 INTEGER1 is less than INTEGER2

                   INTEGER1 -ne INTEGER2 INTEGER1 is not equal to INTEGER2

                   FILE1 -nt FILE2 FILE1 is newer (modification date) than FILE2

                   FILE1 -ot FILE2 FILE1 is older than FILE2

                   -b FILE FILE exists and is block special

                   -c FILE FILE exists and is character special

                   -d FILE FILE exists and is a directory

                   -e FILE FILE exists 文件存在

                   -f FILE FILE exists and is a regular file 文件存在且是普通文件

                   -h FILE FILE exists and is a symbolic link (same as -L)

                   -L FILE FILE exists and is a symbolic link (same as -h)

                   -G FILE FILE exists and is owned by the effective group ID

                   -O FILE FILE exists and is owned by the effective user ID

                   -p FILE FILE exists and is a named pipe

                   -s FILE FILE exists and has a size greater than zero

                   -S FILE FILE exists and is a socket

                   -w FILE FILE exists and is writable

                   -x FILE FILE exists and is executabl

               -b     当file存在并且是块文件时返回真

               -c     当file存在并且是字符文件时返回真

               -d     当pathname存在并且是一个目录时返回真

               -e     当pathname指定的文件或目录存在时返回真

               -f     当file存在并且是正规文件时返回真

               -g     当由pathname指定的文件或目录存在并且设置了SGID位时返回为真

               -h     当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效

               -k     当由pathname指定的文件或目录存在并且设置了“粘滞”位时返回真

               -p     当file存在并且是命令管道时返回为真

               -r     当由pathname指定的文件或目录存在并且可读时返回为真

               -s     当file存在文件大小大于0时返回真

               -u     当由pathname指定的文件或目录存在并且设置了SUID位时返回真

               -w     当由pathname指定的文件或目录存在并且可执行时返回真。一个目录为了它的内容被访问必然是可执行的。

               -o     当由pathname指定的文件或目录存在并且被子当前进程的有效用户ID所指定的用户拥有时返回真。


               比较字符写法:
               -eq    等于
               -ne    不等于
               -gt    大于
               -lt    小于
               -le    小于等于
               -ge    大于等于
               -z     空串
               * =    两个字符相等
               * !=   两个字符不等
               * -n   非空串

 

posted on 2013-04-03 16:58 王海光 阅读(436) 评论(0)  编辑 收藏 引用 所属分类: 脚本

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理