bash :Bourne Again Shell (bash, bsh 的扩展)。
tcsh :是 C Shell 的扩展。
ksh :是 UNIX 系统上的标准 Shell。
系统可用的 Shell
cat /etc/shells
参考
- $ man 7 glob
[[:lower:]]
等价于 [a-z]
[[:upper:]]
等价于 [A-Z]
[[:alpha:]]
等价于 [a-zA-Z]
[[:digit:]]
等价于 [0-9]
[[:alnum:]]
等价于 [a-zA-Z0-9]
[[:cntrl:]]
任何一个控制字符[[:blank:]]
任何一个 空格符 或 制表符(呈水平排列的空白字符)[[:space:]]
任何一个 空格符 或 制表符 或 换行符 或 换页符 或 回车符(呈水平或垂直排列的空白字符)[[:print:]]
任何一个可打印字符,包括空格[[:graph:]]
任何一个可打印字符,不包括空格[[:punct:]]
除了空白字符和字母数字之外的任何一个可打印字符(标点符号)ls *.c # 列出当前目录下的所有C语言源文件
ls /home/*/*.c # 列出/home目录下所有子目录中的所有C语言源文件
ls n*.conf # 列出当前目录下的所有以字母n开始的conf文件
ls test?.dat # 列出当前目录下的以test开始的,随后一个字符是任意的.dat文件
ls [abc]* # 列出当前目录下的首字符是a或b或c的所有文件
ls [!abc]* # 列出当前目录下的首字符不是a或b或c的所有文件
ls [a-zA-Z]* # 列出当前目录下的首字符是字母的所有文件
~
$
history
: 查看所有命令历史history n
: 查看命令历史中最近的 n 条命令HISTSIZE
: 命令历史记录的条数HISTFILE
: 默认为 ~/.bash_historyHISTFILESIZE
: 命令历史文件记录历史的条数HISTIGNORE
:指定不被记入命令历史的命令(多个用:间隔)HISTCONTROL
:控制命令历史的记录方式
history -a
: 追加当前会话缓冲区的命令历史列表至命令历史文件中history -r
: 读取命令历史文件并将其内容追加到当前会话缓冲区的历史列表中history -c
: 手动清除当前会话缓冲区的命令历史列表
- 使用 up(向上)和 down(向下)键来上下浏览以前输入的命令
!!
重复前一个命令!n
按照 history 命令输出中的序号来重复对应命令!-n
重复n个命令之前的那个命令!string
重复前一个以 “string” 开头的命令!?string
重复前一个包含 string 的命令,.
(点击 Esc键,然后点击 . 键)+.
(按住 Alt键的同时点击 . 键)!$
^old^new
cp filter.c /usr/local/src/project
^filter^frontend
Ctrl-a
- 移动到行首Ctrl-e
- 移动到行尾Ctrl-u
- 删除到行首Ctrl-k
- 删除到行尾Ctrl-arrow
ctrl-b
ctrl-f
- 向左或向右移动一个字符Esc-b
- 左移一个单词Esc-f
- 右移一个单词其他快捷键
Ctrl-l
-clear
Ctrl-d
- 正常终止一个进程的执行Ctrl-c
- 强行终止一个进程的执行
- 同时存在命令和同名的别名时,若要执行原命令
可使用\COMMAND
形式,如\ls
$ echo file{1,3,5}
file1 file3 file5
$ rm -f file{1,3,5}
$ cp abc.{conf,conf.bak}
$ cp abc.conf{,.bak}
$ echo --exclude={abc,bcd,cde}
$ echo file{1..5}
file1 file3 file5
$ cp file{1..5} mydir
$ echo 2016-{09..12} 2017-{01,02}
$( )
或 ``
$ echo "This system's name is $(hostname)."
This system's name is server1.example.com
$ echo "i am `whoami`"
i am root
$ rpm -qi $(rpm -qf $(which ls))
变量名=值
$变量名
${变量名}
$ HI=“hello, and welcome to $(hostname).”
$ echo $HI
Hello, and welcome to cl7h1.
linux=distro
distro=centos
echo ${!linux} # 变量的间接引用
强引用和弱引用
""
:弱引用,其中的变量引用会被替换为变量值''
:强引用,其中的变量引用不会被替换为变量值,而保持原字符串
''
)防止所有扩展""
)也防止所有扩展,但是以下情况例外:
$
(美元符号) - 变量扩展!
(叹号) - 历史命令替换$[算术表达式]
$((算术表达式))
bc
、awk
>
把STDOUT重定向到文件2>
把STDERR重定向到文件>>
把STDOUT重定向到文件(追加式)2>>
把STDERR重定向到文件(追加式)命令1 | 命令2
less :一页一页地查看输入:
$ ls -l /etc | less
grep :过滤文本
$ ls -l | grep “^d”
$ cat /etc/passwd | grep ^username
$ dmesg | grep eth0
mail: 通过电子邮件发送输入:
$ echo “test email” | mail -s “test” [email protected]
统计磁盘占用
$ du . --max-depth=1 | sort -rn | head -11
$ du * -cks | sort -rn | head -11
$ du -S | sort -rn | head -11
统计进程
# ps -e -o “%C : %p : %z : %a”|sort -k5 -nr (按内存使用)
# ps -e -o “%C : %p : %z : %a”|sort -nr (按CPU使用)
统计当前目录下的文件数和目录数
$ ls -l | grep “^-” | wc -l
$ ls -l | grep “^d” | wc -l
为用户设置临时口令
# echo “passw0rD” | passwd --stdin user1
&>
把所有输出重定向到文件(覆盖式)&>>
把所有输出重定向到文件(追加式)2>&1
: 用于以管道方式同时传递 STDOUT 和 STDERR|&
: 2>&1 |
的简化形式()
:合并多个程序的 STDOUT 和 STDERR$ 命令1 | tee 文件名 | 命令2
<
来重定向标准输入wc -c <<< "Strings"
wc -c <<< $PATH
<<终止词
从键盘将多行内容重定向给 STDIN终止词
位置的所有文本都发送给 STDIN$ cat > ~/mail.txt < Hi Jane,
>
> Please give me a call when you get in.
>
> Boris
> END
$ mail -s "Please Call" [email protected] < ~/mail.txt
或:
$ mail -s "Please Call" [email protected] < Hi Jane,
>
> Please give me a call when you get in.
>
> Boris
> END
$?
保存最近一条命令的执行状态ls
echo $?
ls $RANDOM
echo $?
&&
: 只有左面的命令执行正确才执行右侧的命令(短路作用)||
: 只有左面的命令执行错误才执行右侧的命令(短路作用)!
: 对命令的执行状态按逻辑取反&&(与):
- CMD1 && CMD2
- 成功 && 成功 = 成功
- 成功 && 失败 = 失败
- 失败 && 成功 = 失败 (短路)
- 失败 && 失败 = 失败 (短路)
||(或):
- CMD1 || CMD2
- 成功 || 成功 = 成功 (短路)
- 成功 || 失败 = 成功 (短路)
- 失败 || 成功 = 成功
- 失败 || 失败 = 失败
{ cal date echo $[i+=7] }
(cal date echo $[i+=7])
eval
命令
- 首先扫描命令行进行所有的替换(变量替换、命令替换),然后再执行命令
- 比较
echo {$(date -d '-5 seconds' +%s)..$(date +%s)} eval echo {$(date -d '-5 seconds' +%s)..$(date +%s)} begin=$(date -d '-5 seconds' +%s) end=$(date +%s) echo {$begin..$end} eval echo {$begin..$end}
export
内置命令将本地变量设置为环境变量
export <变量名1=值1> [<变量名2=值2> ...]
export <变量名1> [<变量名2> ...]
env
- 查看所有的环境变量set
- 查看所有的环境变量和自定义变量unset <变量名1> [<变量名2> ...]
export -n <变量名1> [<变量名2> ...]
su -
su
/etc/profile
(全局)~/.bash_profile
(个人)/etc/bashrc
(全局)~/.bashrc
(个人)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Login shell:
|--> /etc/profile --> /etc/profile.d/*.sh
|
|-> $HOME/.bash_profile --> $HOME/.bashrc --> /etc/bashrc
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Non-Login shell:
|--> $HOME/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~