Q1: Shell脚本是什么、它的作用?
A1:一个Shell脚本是一个文本文件,包含一个或多个命令。作为系统管理员,我们将多条命令放在同一个Shell脚本来完成一些日常工作任务。
Q2:“#!/bin/bash”的作用 ?
A2:#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
Q3: 什么是默认登录shell,如何改变指定用户的登录shell
A3:在Linux操作系统,“/bin/bash”是默认登录shell,是在创建用户时分配的。
使用chsh命令可以改变默认的shell。示例如下所示:
# chsh <用户名> -s <新shell>
# chsh linuxtechi -s /bin/sh
Q4:可以在shell脚本中使用哪些类型的变量?
A4:a.用户定义的变量 (self_define_name=10 echo "$self_define_name")
b.系统自定义的变量(可以通过set命令查看,大写字母命名的)
echo $LANG 输出结果:en_US.UTF-8
注意:变量赋值,变量名和等号之间不能有空格。
使用变量:echo ${your_name} 或者 echo $your_name,{}可加可不加
只读变量readonly your_name
可使用 declare 或 typeset 命令来声明整数变量。环境变量:echo $PATH
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
Q5: 如何将标准输出和错误输出同时重定向到同一位置?
A5:ls /etc/proc/ &> out.txt
Q6: 如何使脚本可执行 ?
A6:给文件加可执行权限
# chmod a+x test.sh
Q7: 如何调试shell脚本 ?
A7:sh -x test.sh
或者在shell script文件写上这条,# ! /bin/bash -xv
Q8:$的用法有哪些?代表什么意思?
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示全部传递的参数。(以字符串列出所有传递到脚本中的参数) |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 显示全部传递的参数。(以分隔符列出所有传递到脚本中的参数) 实例: for i in "$@"; do echo $i done output: 1 2 3 如果是用$*,则output是1 2 3 |
$? | 显示上一条命令的退出状态。0表示没有错误,其他任何值表明有错误。 如果有错误,可以使用perror 错误码,查看是类型的错误 $ perror 2 OS error code 2: No such file or directory |
Q9:如何获取来自终端的输入?
A9:a.通过read命令
#!/bin/bash
echo ‘Please enter your name’ read name
echo “My Name is $name”
# ./test.sh Please enter your name
LinuxTechi
My Name is LinuxTechi
b.$@或$*获取用户输入的所有参数
Q10: 如何取消变量或取消变量赋值 ?
A10:“unset”命令用于取消变量或取消变量赋值(# unset <变量名>)
Q11:从文件中获取最后一行?如何从文件中获取第一行?
A11:最后一行tail -1。第一行 head -1
其它操作:从文本文件中获取第 10 行, head -10 aa.txt | tail -1
Q12:打印文本中有“self”字符的行
awk 是一种处理文本文件的语言,是一个强大的文本分析工具。
[root@iZbp1gyr6n52tkg93dybldZ ~]# awk '/self/ {print NR, $0}' aa.sh
3 self_define_name=10
4 echo "$self_define_name"
Q13:if语句、if else、if elif语句
if语句:
if condition
then
command
fi
if else语句:
if condition
then
command
else
command2
fi
if elif 语句:
if condition
then
command1
elif condition
then
command2
else
command3
fi
实例:
a=10
b=15
if [ $a == $b ]
then
echo "a equal b"
elif [ $a -gt $b ]
then
echo "a is greater than b"
else
echo "b is lowwer than a"
fi
算术运算符:
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | `expr $a + $b` 结果为 30。 |
- | 减法 | `expr $a - $b` 结果为 -10。 |
* | 乘法 | `expr $a \* $b` 结果为 200。 |
/ | 除法 | `expr $b / $a` 结果为 2。 |
% | 取余 | `expr $b % $a` 结果为 0。 |
= | 赋值 | a=$b 把变量 b 的值赋给 a。 |
== | 相等。用于比较两个数字,相同则返回 true。 | [ $a == $b ] 返回 false。 |
!= | 不相等。用于比较两个数字,不相同则返回 true。 | [ $a != $b ] 返回 true。 |
算术运算符可以用expr命令: `` 注意是这个符号,不是单引号
val=`expr $a + $b`
echo "a + b : $val"
关系运算符:
运算符 | 说明 | 举例 |
---|---|---|
-eq | 检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
-ne | 检测两个数是否不相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | [ $a -gt $b ] 返回 false。 |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | [ $a -lt $b ] 返回 true。 |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 | [ $a -ge $b ] 返回 false。 |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ $a -le $b ] 返回 true。 |
Q13:for循环语句
for var in var_list
do
echo $var
done
for loop in 1 2 3 4 5
do
echo "the value is: $loop"
done
Q14:while循环
while 循环用于不断执行一系列命令,也用于从输入文件中读取数据
while condition
do
command1
done
Q14:until语句
until 循环执行一系列命令直至条件为 true 时停止。
num=1
until [ ! $num -lt 10 ]
num=`expr $num + 1`
do
echo num
num=`expr $num + 1`
done
输出1-9
Q15:case 语句
echo "请输入1-3的数字"
echo "你输入的值为"
read num
case $num in
1) echo "你输入了1"
;;
2) echo "你输入了2"
;;
3) echo "你输入了3"
;;
esac
Q16:break 和 continue的区别
A16:break命令是退出执行中的循环。
continue命令只跳出当前循环的迭代,而不是整个循环
Q17:字符串比较
参数 | 说明 |
---|---|
= | 等于则为真 |
!= | 不相等则为真 |
-z 字符串 | 字符串的长度为零则为真 |
-n 字符串 | 字符串的长度不为零则为真 |
Q18:文件测试运算符有哪些
cd /bin
if test -e ./bash
then
echo "file exist"
else
echo "file does not exist"
fi
-e 文件名 | 如果文件存在则为真 |
-r 文件名 | 如果文件存在且可读则为真 |
-w 文件名 | 如果文件存在且可写则为真 |
-x 文件名 | 如果文件存在且可执行则为真 |
-s 文件名 | 如果文件存在且至少有一个字符则为真 |
-d 文件名 | 如果文件存在且为目录则为真 |
Q19:如何获取数组的长度
my_array=(a b "c" d e)
echo "array length is ${#my_array[*]}"
通过下标获取数组的值“:echo "array 0 is ${my_array[0]}"
关联数组:declare -A site=(["web1"]="aliyun" ["web2"]="tencent")
通过键访问关联数组内的值:echo "${site[web1]}"
获取字符串的长度:echo ${#string}
string="fortest "
echo ${string:1:4} 输出orte
Q20:如何定义和调用函数
function sum(){
he=`expr $1 + $2`
echo "he value is $he"
}
sum 1 3
Q21:如何引用外部文件
tesh.sh
#!/bin/bash url="test1"
#!/bin/bash # source ./test1.sh echo "test1 info is:$url"
$ chmod +x test2.sh $ ./test2.sh test1 info is test1
#! /bin/bash
# ! /bin/bash -xv,this is zhushi,-xv is debug bash
self_define_name=10
echo "$self_define_name"
echo $LANG
echo "the shell script filename is $0"
echo "the first input parameter is $1"
echo "the the count of parameter is $#"
echo "$* echo all parameter is {$*}"
echo "$@ echo all parameter is $@"
# 定义环境变量
export MY_ENV_VAR="SomeValue"
# 打印环境变量
echo "Environment Variable: $MY_ENV_VAR"
function sum(){
he=`expr $1 + $2`
echo "he value is $he"
}
sum 1 3
多行注释:使用了冒号 : 命令,并用单引号 ' 将多行内容括起来
: '
注释1111
注释22222
'