Bash 基本语法

| 分类 PIECE  | 标签 shell  bash 

>

输出重定向。将命令执行的标准输出( stdout)保存为文件。Unix系列操作系统将设备视为文件,故可以将命令执行结果发送到特定设备

$ echo "hello" > ./hello.txt
$ echo "hello" > /dev/null

<

输入重定向。读取文件内容,用作命令的标准输入(stdin)

$ cat < ./ hello.txt

>>

将命令执行的标准输出(stdout)添加到文件。”>” 会覆盖文件原有内容,而 “»” 仅将内容添加到文件末尾

$ echo "world" >> ./hello.txt

2>

将命令执行的标准错误(stderr)保存为文件

2>>

将命令执行的标准错误(stderr)添加到文件

&>

将标准输出与标准错误全部保存为文件

1>&2

将标准输出发送为标准错误。虽然使用echo命令可以将字符串输出为标准输出,但由于发送为标准错误,故变量中没有字符串

$ hello=$(echo "Hello Wrold" 1>&2)
$ echo $hello

2>&1

将标准错误发送为标准输出。由于不存在 abcd这样的命令,所以发生的错误发送为标准输出后,再次发送至/dev/null,故不输出任何内容

$ abcd > /dev/null 2>&1

|

管道。将命令执行的标准输出发送为其他命令的标准输入,即在第二个命令中处理第一个命令的输出值

$ ls -al | grep .txt

$

Bash的变量。存储值时不使用$符号,仅输入变量时才使用

$ hello = "Hello World"
$ echo $hello

Hello World

$()

将命令的执行结果变量化。将命令的执行结果存储到变量或者传递给其他命令的形式参数时使用。此外,也用于将命令的执行结果放入字符串

$ sudo docker rm $(docker ps -aq)
$ echo $(date)

Tue Sep 9 21:24:30 KST 2017

` `

与$()类似,将命令执行结果变量化

$ sudo docker rm `docker ps -aq`
$ echo `date`

Tue Sep 9 21:24:30 KST 2017

&&

在一行内运行多个命令。只有前面的命令执行没有错误时,才执行后面的命令

$ make && make install

’ ‘

字符串。不处理中的变量,只使用变量名。也不会处理”与$(),直接使用

$ echo '$USER'

$USER

直接输出 $USER

” “

字符串。主要用于将字符串形式参数输入命令或存储到变量。与’ ‘ 不同,若” “中有变量,会替换为变量内容。另外,”与 $() 也会替换为运行结果值

$ echo "Host name is $(hostname), and Time: `date`"

Host name is Vincen-MacBook-Pro.local, and Time: Fri May 12 16:31:05 CST 2017

${}

变量替换。主要用于在” “字符串中输出变量。也可以只使用$替代${}

也用于在脚本中设置变量默认值。下列示例中,若有 HELLO变量,则直接使用,否则代入默认设置值 abcd

$ HELLO=
$ HELLO=${HELLO-"abcd"}
$ echo $HELLO

由于已经有值为 NULL的 HELLO变量,故不会代入默认值。

下列示例中,若变量中有值,则直接使用,若值为 NULL,则代入默认值 abcd

$ WORLD=
$ WORLD=${WORLD:-"abcd"}
$ echo $WORLD

abcd

由于变量值为 NULL,故代入默认值

{1..10}

用于表示连续数字,格式为{起始数字..末尾数字}

$ echo {1..10}

1 2 3 4 5 6 7 8 9 10

{字符串1, 字符串2}

在 {} 内指定多个字符串,减少命令执行次数。下列示例将 hello.txt 和 world.txt 两个文件同时复制到 hello-dir 目录

$ cp ./{hello.txt, world.txt} hello_dir/

if

if 条件句,用于比较变量或字符串

if [$a -eq $b]; then
    echo $a
fi
比较数字

-eq : 等于
-ne : 不等于
-gt : 大于
-ge : 大于等于
-lt : 小于
-le : 小于等于

比较字符串

=, == : 相同
!= : 不相同
-z : 字符串为 NULL时
-n : 字符串不为 NULL时

文件比较运算符

-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 ]

for

循环语句,循环变量中的值或者指定范围进行循环

for i in $(ls)
do
    echo $i
done

for ((i = 0; i < 10; i++))
do
    echo $i
done

NUM = (1 2 3)
for i in ${NUM[@]}
do
    echo $i
done

while

while:
do
    echo "Hello world";
    sleep 1;
done

<<<

将字符串发送到命令(进程)的标准输入

$ cat <<< "User name is $USER"

User name is vincen

<<EOF

将多行字符串发送到命令〔进程)的标准输入

cat > ./hello.txt <<EOF
Hello world
Host name is $(hostname)
User name is $(USER)
EOF

cat命令用于输出文件或标准输入的内容。将 cat的标准输出保存到./hello.txt,用<<EOF将字符串发送到 cat 的标准输入。之后,3行字符串被保存到./hello.txt文件


上一篇     下一篇