系统为这三个文件分配了文件标识符fd(file descripter),在Linux系统下,一切皆是文件,对文件的操作,一般要用到文件标识符。
它们的文件标识符,分别为0,1,2,关系如下表:
文件描述符 | 名称 | 通用缩写 | 默认值 |
0 | 标准输入 | stdin | 键盘 |
1 | 标准输出 | stdout | 屏幕 |
2 | 标准错误 | stderr | 屏幕 |
语法 | 说明 |
> | 把标准输出重定向到一个新文件,”>” 会覆盖原有的内容。 |
>> | 把标准输出重定向到一个文件中,不覆盖原有的内容(追加)。 |
2 > | 把标准错误重定向到一个文件中 |
2 >> | 把标准错误重定向到一个文件中(追加) |
2 > &1 | 把标准输出和错误重定向到一个文件(追加) |
语法 | 说明 |
< | filename文件作为标准输入 |
<< delimiter | 从标准输入中读入,直到遇到delimiter分界符 |
语法 | 说明 |
> &m | 把标准输出重定向到文件描述符m中 |
< &- | 关闭标准输入 |
> &- | 关闭标准输出 |
通过使用printenv可以显示当前的环境变量
[root@IDC-D-1699 ~]# printenv HOSTNAME=IDC-D-1699 TERM=xterm SHELL=/bin/bash HISTSIZE=1000 SSH_CLIENT=111.200.23.36 31752 22 QTDIR=/usr/lib64/qt-3.3 QTINC=/usr/lib64/qt-3.3/include SSH_TTY=/dev/pts/3 USER=root MAIL=/var/spool/mail/root PATH=/usr/local/java/jdk1.8.0_101/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin PWD=/root JAVA_HOME=/usr/local/java/jdk1.8.0_101 LANG=zh_CN.UTF-8 HISTCONTROL=ignoredups SHLVL=1 HOME=/root LOGNAME=root
Shell不需要明确定义类型,事实上Shell变量的值都是字符串,比如我们定义var=45,其实var的值是字符串而非整数,shell变量不需要事先定义就可以使用,如果使用没有定义的变量,这字符串取值为空字符串。
变量名称=”变量Value”,“=”的两边不能有空格,否则shell解释成名称和命令参数。
获取变量使用 $变量名称
a="ywq" echo $a
可以使用*、?、[]对文件名代换
匹配符 | 说明 |
* | 匹配0个多个任意字符 |
? | 匹配一个任意字符 |
[] | 匹配方括号中任意一个字符的一次出现 |
将命令替换为命令输出,所有的shell支持使用反引号的方式进行命令替换,命令替换可以嵌套,需要注意的是如果使用反引号的形式,在内部反引用前必须使用反斜杠转移
匹配符 | 说明 |
`` | 例如 echo ${pwd} |
$() | 例如 echo `pwd` |
匹配符 | 说明 |
$(()) | 例如 echo $((4 + 6)) |
‘\’用作转义字符。
单引号内的所有字符都保持它本身字符的意思,而不会被bash进行解释。
除了$、``、/外,双引号内所有的字符保持字符本身的含义。
在shell中用if,then,elif,else,fi这几条命令实现分支控制,这种流程控制语句本质上也是由若干个逻辑判断组成,需要注意的是。
例如:
if [ -f $a ];then echo "hello world!" fi
case结构用于多种情况的条件判断,类似于其它语言的switch/case,但从语法结构上有很大的不同,常用格式。
case 字符串 in 模式) 语句 ;; 模式2 | 模式3) 语句 ;; *) 默认执行的 语句 ;; esac
例如
#!/bin/bash read -p "请输入要查查询的区号:" num case $num in *)echo -n "中国";;& 03*)echo -n "河南省";;& ??71)echo "郑州市";; ??72)echo "安阳市";; ??73)echo "新乡市";; ??73)echo "许昌市";; 07*)echo -n "江西省";;& ??91)echo "南昌市";; ??92)echo "九江市";; ??97)echo "赣州市";; esac
注意
当程序指定到条件语句;;&时,不会停止,直到执行到;;esac
不管是if还是case,他们的结尾都很有意思,if的结尾是fi,而case的结尾是easc,首位和尾部正好相反。
例如:
打印目录下所有的文件
#!/bin/bash for i in $( ls ); do echo item: $i done
打印序列
#!/bin/bash for n in $(seq 1 10); do echo $n done
例如:
#!/bin/bash counter=$1 while [ $counter -lt 10 ]; do echo the counter is $counter counter=$(($counter+1)) done
例如:
#!/bin/bash counter=$1 until [ $counter -lt 10 ]; do echo the counter:$counter let counter=counter-1 done
比较符 | 说明 | 举例 |
-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 /varmytmp.txt ] |
-x filename | 如果filename可执行,则为真 | [ –x /usr/bin/grep ] |
-s filename | 如果filename不是空白文件,则为真 | |
-u filename | 如果filename有SUID属性,则为真 | |
-g filename | 如果filename有SGID属性,则为真 | |
-k filename | 如果filename有stickybit属性,则为真 | |
file1 –nt file2 | 如果file1比file2新,则为真 | |
file1 –ot file2 | 如果file1比file2旧,则为真 |
比较符 | 说明 | 举例 |
-z string | 如果string长度为零,则为真 | |
-n string | 如果string长度不为零,则为真 | |
str1 = str2 | 如果str1与str2相同,则为真 | |
str1 != str2 | 如果str1与str2不相同,则为真 |
比较符 | 说明 | 举例 |
-eq | 等于 | |
-ne | 不等于 | |
-lt | 小于 | |
-le | 小于或等于 | |
-gt | 大于 | |
-ge | 大于或等于 |
参考:https://www.cnblogs.com/ywqbj/p/5773033.html
例如: