shell-script-05 shell脚本常见问题

shell脚本常见问题

1、[ $a == $b ] 和 [ $a -eq $b ] 有什么区别

1
2
[ $a == $b ]  用于字符串比较
[ $a -eq $b ] 用于数字比较

2、bash中如何使用数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1)在bash中定义数组
array=("Hi" "my" "name" "is")

2)打印数组的第一个元素
echo ${array[0]}

3)打印数组的所有元素
echo ${array[@]}

4)打印数组索引
echo ${!array[@]}

5)移除数组中索引为3的元素
unset array[3]

6)添加array[100]
array[100]='num-100'

3、shell如何获取输入值

1)使用参数

1
./script.sh param1 param2

2)(交互式输入)使用read命令,如下例

1
2
3
4
5
6
7
8
[root@localhost ~]# cat read.sh 
#!/bin/bash
read -p "Please input:" input
echo $input
[root@localhost ~]# . read.sh
Please input:hello
hello
[root@localhost ~]#

4、 bash里如何给变量赋值

1)直接给变量赋值

1
2
3
4
5
6
[zyfzone@yfeng ~]$ bash
[zyfzone@yfeng ~]$ a=10
[zyfzone@yfeng ~]$ echo a
a
[zyfzone@yfeng ~]$ echo $a
10

2)将命令执行结果给变量赋值

1
2
3
4
5
6
7
8
[zyfzone@yfeng ~]$ b=`date`
[zyfzone@yfeng ~]$ echo $b
Tue Oct 1 11:10:44 CST 2019
[zyfzone@yfeng ~]$ echo b
b
[zyfzone@yfeng ~]$

注意:变量b中保存的永远是Tue Oct 1 11:10:44 CST 2019这个值,如需获取当前时间,需要输入date命令

3)实例(结论是mem那一行的total=used+free+buff/cache)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[zyfzone@yfeng ~]$ free -h
total used free shared buff/cache available
Mem: 1.8G 603M 98M 96M 1.1G 942M
Swap: 1.0G 0B 1.0G
[zyfzone@yfeng ~]$ bash
[zyfzone@yfeng ~]$ mem_total=`free -h | grep 'Mem' | awk '{print $2}'`
[zyfzone@yfeng ~]$ mem_used=`free -h | grep 'Mem' | awk '{print $3}'`
[zyfzone@yfeng ~]$ mem_free=`free -h | grep 'Mem' | awk '{print $4}'`
[zyfzone@yfeng ~]$ mem_cache=`free -h | grep 'Mem' | awk '{print $6}'`
[zyfzone@yfeng ~]$ echo $mem_total '=' $mem_used '+' $mem_free '+' $mem_cache
1.8G = 605M + 96M + 1.1G
[zyfzone@yfeng ~]$ exit
exit
[zyfzone@yfeng ~]$

5、两个整数相加的多种方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost ~]# cat add.sh 
#!/bin/bash
a=1
b=2
let c1=$a+$b
echo $c1
echo $[$a+$b]
echo $(($a+$b))
echo "$a+$b" | bc

[root@localhost ~]# . add.sh
3
3
3
3
[root@localhost ~]#

6、与或运算同时使用

1)在shell中&& 和||没有优先级之分,它只是从左向右执行。

1
2
3
4
[root@localhost ~]# echo 0 || echo 1 && echo 1
0
1
[root@localhost ~]#

2)注意&&需要前一条命令(或脚本)成功地执行完成之后,才执行后一条命令(或脚本)。

1
2
3
[root@localhost ~]# cat abc.txt && echo 1
cat: abc.txt: No such file or directory
[root@localhost ~]#

3)如下,从左到右

1
2
3
[root@localhost ~]# name=tom && echo $name
tom
[root@localhost ~]#

7、如何在后台运行脚本

1)在后台运行脚本,方式1

1
2
command &
#此时主进程会继续往下执行,而子进程会在后台启动运行。

2)在后台运行脚本,方式2

1
2
nohup command &
#正如名字所声称的,忽略所有发送给子命令的挂断(SIGHUP)信号,即使按下ctrl+c,脚本依然还在继续执行。

3)举例(下面一个例子“sleep睡眠”中定义了b.sh)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#方式1
[root@localhost ~]# . b.sh &
[1] 19368
[root@localhost ~]# kill 19368
[root@localhost ~]#
#此时脚本运行停止


#方式2
[root@localhost ~]# nohup: ignoring input and appending output to ‘nohup.out’
^C
[root@localhost ~]#
#此时脚本依然在后台运行
#可以找出进程id,将之kill掉即可终止掉其运行
[root@localhost ~]# ps -aux | grep /bin/bash
root 19458 0.0 0.1 113176 1452 pts/1 S Oct01 0:00 /bin/bash ./b.sh
root 20872 0.0 0.0 112704 968 pts/2 R+ 00:03 0:00 grep --color=auto /bin/bash
[root@localhost ~]# kill -9 19458
[root@localhost ~]#

8、sleep睡眠

在有的shell(比如linux中的bash)中,sleep支持睡眠(分,小时)

1
2
3
4
sleep 1    睡眠1秒
sleep 1s 睡眠1秒
sleep 1m 睡眠1分
sleep 1h 睡眠1小时

如下例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@localhost ~]# cat b.sh 
#!/bin/bash
while [ 0 ];do
echo `date` >> t.txt
sleep 1
done
[root@localhost ~]# cat t.txt
Tue Oct 1 23:48:57 EDT 2019
Tue Oct 1 23:48:58 EDT 2019
Tue Oct 1 23:48:59 EDT 2019
Tue Oct 1 23:49:00 EDT 2019
Tue Oct 1 23:49:01 EDT 2019
Tue Oct 1 23:49:02 EDT 2019
Tue Oct 1 23:49:03 EDT 2019
Tue Oct 1 23:49:04 EDT 2019
Tue Oct 1 23:49:05 EDT 2019
Tue Oct 1 23:49:06 EDT 2019
Tue Oct 1 23:49:07 EDT 2019
[root@localhost ~]#
欢迎打赏,谢谢
------ 本文结束------
0%