Lab0 Notes

Lab0 Notes

  • 一些特殊字符
1
2
3
4
5
6
7
8
9
Linux——$1$#$@$0$1$2

$? ——最后运行的命令的结束代码(返回值)
$- ——使用 Set 命令设定的 Flag 一览
$* ——所有参数列表。如 "$*" 用「"」括起来的情况、以 "$1 $2$n" 的形式输出所有参数。
$@ ——所有参数列表。如 "$@" 用「"」括起来的情况、以 "$1" "$2""$n" 的形式输出所有参数。
$# ——添加到 Shell 的参数个数
$0 ——Shell 本身的文件名
$1$n ——添加到 Shell 的各参数值。$1 是第 1 参数、$2是第 2 参数…。
  • 变量,注意要用双引号括特殊这些字符
1
2
3
#!/bin/bash
str="Hello, $1 and $2!"
echo $str
  • if
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
if (($1 > $2 ))
then
echo "first > second"
elif (($1 < $2 ))
then
echo "first < second"
elif (($1 == $2 ))
then
echo "first == second"
else
echo "I don't know..."
fi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
a=123
b=abc
c=‘123’
d=“hello world”

读取终端的输入给变量赋值:read
echo -n "Please Input your name:"
read name
echo "Hi,$name,welcome to uncle Jelly's cabin!"
或者:read -p "Please Input your name:" name

反引用:``,利用其他命令的输出来给一个变量赋值
dir=`pwd`
tim=`date`
echo " 我在$dir 目录下 "
echo " 现在时间是$time"
  • 赋值

  • 运算

  • 常用语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
> 输出重定向,将命令标准输出保存为文件。$ echo "hello" > ./hello.txt
< 输入重定向,读取文件内容,作为标准输出。$ cat < ./hello.txt
>> 输出重定向,将命令标准输出追加到文件。$ echo "hello" > ./hello.txt
2> 将命令执行的标准错误(stderr)保存为文件。
2>> 将命令执行的标志错误(stderr)追加到文件。
&> 将标准输出(stdout)和标准错误(stderr)全部保存为文件。
1>&2 将标准输出发送为标准错误。
2>&1 将标准错误发送为标准输出。
| 管道,用于连续命令的执行,前面命令的输出可以传递到后面的命令作为输入。$ ls -al \| grep .txt
$ 变量符,输出变量时使用。
$() 将命令的结果变量化。$ echo $(data)
` ` 将命令的结果变量化。$ echo `data`
&& 一行内连续执行多个命令,有错误时终止。$ make && make install
; 一行内执行多个命令,忽略错误。$ false; echo "hello"
’ ’ 字符串。不处理其中包含的变量。‘ ’ 中使用 “ ” 需要添加转义字符 \
“ ” 字符串。会处理其中包含的变量。“ ” 中可以使用 ‘ ’
${ } 1. 变量替换;2. 默认变量。
\ 将单行命令写成多行。
{1…10} 表示连续数字。
{ 字符串 1, 字符串 2} 指定多个字符串。$ cp ./{exp1.txt,exp2.txt} hello/
if 用于比较变量或字符串。if [$a -eq $b ]; then echo $a fi
for for i in $(ls) do echo $i done
while while : do echo "hello"; sleep; done
<<< 将字符串发送到命令的标准输入:$ cat <<< "User name is $USER"
<<EOF EOF 将多行字符串发送到命令的标准输入
export 设置环境变量。$ export < 变量 >=< 值 >
sed 更改文件中的指定字符串。$ sed -i "s/< 待查找字符串 >< 替换字符串 >/g" < 文件名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
a=2
b=3
c=$[a+b]
d=$[a-b]
g=$[a%b]

c=$[$a+$b] 中括号和里面的表达式可以视作一个变量。在中括号中引用变量可以直接使用变量名,也可以使用 $ 加变量名。

expr:

a=2
b=3
expr $a + $b
expr $a % $b:该命令会将计算结果打印到标准输出
expr的计算结果赋值:反引用
c=`expr $a + $b`

浮点运算:bc
echo '45.36-22.33'|bc
echo 'scale=3;2/3'|bc .666

自增自减:let
let a-=2
let b++
  • for, while, until, break, continue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
for:
1.for i in {1…10} 或者 for i in $(seq 1…10…2)
2. for i in $(seq 1 10)或者 for i in $(seq 1 2 10)
3. for((i=1;i<=10;i++)) 或者 for((i=1;i<=10;i+=2))
do
echo $i
done

#!/bin/bash
for ((a=1; a<=5;a++))
do
echo " 外层循环为$a"
if [$a -gt 2 -a $a -lt 4 ];then
continue
fi

echo $[$a*2]

done


while:
#!/bin/bash
i=0
while [$i -le 10 ]
do
echo $i
let i++
done

until:
#!/bin/bash
a=0
until (($a -gt 10))
d0
echo $a
let a++
done


break: 后面加数字表示跳出几层循环

for ((a=1; a<=5;a++))
do
for ((b=1; b<=5;b++))
do
echo " 内循环第$b 次 "
if [$b -eq 3 ];then
break 2
fi
done
done
  • awk

    1
    -   awk '{[pattern] action}' {filenames}   # 行匹配语句 awk '' 只能用单引号
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 每行按空格或 TAB 分割,输出文本中的 1、4 项
$ awk '{print $1,$4}' log.txt
---------------------------------------------
2 a
3 like
This's
10 orange,apple,mongo
# 格式化输出
$ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
---------------------------------------------
2 a
3 like
This's
10 orange,apple,mongo

1
-   awk -F  #-F 相当于内置变量 FS, 指定分割字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 或者使用内建变量
$ awk 'BEGIN{FS=","} {print $1,$2}' log.txt
---------------------------------------------
2 this is a test
3 Do you like awk
This's a test
10 There are orange apple
# 使用多个分隔符. 先使用空格分割,然后对分割结果再使用 "," 分割
$ awk -F '[,]' '{print $1,$2,$5}' log.txt
---------------------------------------------
2 this test
3 Are awk
This's a
10 There apple

1
-   awk -v  # 设置变量

1
2
3
4
5
6
$ awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt
---------------------------------------------
2 3 2s
3 4 3s
This's 1 This'ss
10 11 10s
  • 条件输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ awk '$1>2' log.txt
$ awk -F: '$3 + $4 > 2000{print $0}' /etc/passwd
$ awk -F: '$3 + $4 > 2000 && $3 * $4 > 2000{print $0}' /etc/passwd

# 输出第二列包含 "th",并打印第二列与第四列
$ awk '$2 ~ /th/ {print $2,$4}' log.txt
---------------------------------------------
this a

# 输出包含 "re" 的行
$ awk '/re/ ' log.txt
---------------------------------------------
3 Do you like awk
10 There are orange,apple,mongo

格式化打印:
$ awk -F: 'BEGIN{OFS=" | "}{printf "|%+15s|%-15s|\n", $NF, $1}' /etc/passwd
| : 以 | 为分隔符
|%+15s| : 以 | 为分隔符 %s 配合 printf 使用 代替当前字符串 右对齐 占用 15 字符