填空
ls、cp等命令文件一般位于哪个目录?
在Linux系统中,第一个启动的进程是:____ 、其编号为:____ 。
给出文件的三种类型的名称
当前用户是stu,当前目录在/home/stu/mydir/,则执行cd ../..命令后当前目录是 ____,再执行cd命令后当前目录是 ____。
👉 执行 cd ../.. 后目录是 /home/ 👉 再执行 cd 后目录是 /home/stu/
________命令可以显示环境变量?
________用户具有系统的最大权限。
Linux原作者是 :________。
选择 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 1、我们实验使用的shell 是哪个? A. bsh → 早期的 Bourne Shell ,现代系统很少使用 B. ksh → Korn Shell ,功能强大但不是默认 C. csh → C Shell ,语法类似C语言,但也不是默认D . bash → Bourne Again Shell ,是 Linux 默认和最常用的 shell 答案:D 、bash 2、可以分页显示文件内容的命令是? A. pwd → 显示当前工作目录,不显示文件内容 B. cat → 显示文件内容,但不能分页 C. more → 分页显示文件内容,适合查看长文件D . page → 不是标准命令 答案:C、more 3、bash中默认已有的变量一般不包括? A. find → 这是一个命令,不是环境变量 B. PWD → 当前工作目录的环境变量 C. HOME → 用户主目录的环境变量D . USER → 当前用户名的环境变量 答案:A、find 4、从标准输入读入值并赋予一个变量的命令是? A. out → 不存在的命令 B. scan → 不是标准 shell 命令 C. read → 从标准输入读取数据并赋值给变量D . in → 不存在的命令 答案:C、read 5、下列哪个命令可将文本文件 f.txt 拷贝为 f.bak? A. cp f.txt | f.bak → 错误,管道符不能这样用 B. cat f.txt > f.bak → 正确,将 f.txt 内容重定向到 f.bak C. cp f.txt > f.bak → 错误,cp 不与重定向符结合D . ls f.txt f.bak → 只是列出文件,不会拷贝 答案:B、cat f.txt > f.bak
简答题 1、解释 read 命令的功能,举例说明其用法
功能:read 命令用于从标准输入(键盘或管道)读取一行数据,并赋值给变量。
基本语法:read 变量名
示例:1 2 3 echo "请输入你的名字:" read nameecho "你好,$name "
执行后,用户输入的内容会赋值给变量 name,再通过 echo 输出。
2、如果当前目录下只有一个文件 abc123,解释 echo abc* 和 echo xyz=abc* 命令的输出
echo abc*
Shell 会进行通配符展开(* 表示匹配任意字符)。
当前目录只有文件 abc123,所以 abc* 展开为 abc123。
输出结果:abc123
echo xyz=abc*
同样,abc* 会展开为 abc123。
所以命令输出:xyz=abc123
假设当前目录下有三个文件:abc1、abc2、abc3
echo abc*
Shell 会对通配符 * 进行展开。
abc* 会匹配所有以 “abc” 开头的文件。
因此展开结果是:abc1 abc2 abc3
输出结果:abc1 abc2 abc3
echo xyz=abc*
同样,abc* 会展开为 abc1 abc2 abc3。
所以命令输出:xyz=abc1 abc2 abc3
3、画图示意操作系统、硬件和应用软件关系
按要求写命令 1、显示当前目录下文件名以abc开头同时以123结尾的文件
2、把文本文件file1复制为file2,然后在file2尾部增加一行内容为“END”
1 2 cp file1 file2echo "END" >> file2
3、设置权限,自己的文件file1,只允许自己完全访问和使用,自己之外的人仅有读权限
解释:7 = rwx(自己可读写执行),4 = r(其他用户只读)
4、假设myprog.sh是你所写的一个脚本程序,写出命令在后台执行它
5、用命令或命令组合列出当前目录下的所有目录文件(不列出其他文件)
6、在上一级目录的子目录src中建立一个空文件,文件名叫my_logfile
7、在当前路径下建立 /letters/mail 的符号链接 m-soft
1 ln -s /letters/mail m-soft
8、在屏幕上显示字符串 $abc
解释命令含义 1、解释这行命令的含义。如果输入123,会显示什么?如果输入1234显示什么?
read abc ; test $abc -lt 999 && res=’too small’ || res=ok ; echo $res
read abc
test $abc -lt 999
判断变量 abc 的值是否 小于 999。
-lt 表示 “less than”。
&& res=’too small’
如果上一步条件成立(即 $abc < 999),则执行 res=’too small’。
|| res=ok
如果条件不成立(即 $abc >= 999),则执行 res=ok。
echo $res
2、grep '789' lppasswd | wc -l
grep '789' lppasswd:在文件 lppasswd 中查找包含字符串 789 的行。
| wc -l:统计匹配到的行数。
输出结果:文件中包含 789 的行数。
3、ls –l | grep ‘^d’
ls -l:列出当前目录下文件的详细信息。
grep '^d':筛选以 d 开头的行(在 ls -l 输出中,d 表示目录)。
输出结果:当前目录下的所有目录信息。
4、ls -d ?[!y]*[e-f]
ls -d:列出匹配的文件名,而不是展开目录内容。
?:匹配任意单个字符。
[!y]:匹配除 y 外的任意字符。
*:匹配任意长度的字符串。
[e-f]:文件名以 e 到 f 结尾。
输出结果:当前目录下符合该模式的文件或目录名。 5、echo $HOME
$HOME:环境变量,表示用户的主目录路径。
echo $HOME:输出主目录路径,例如 /home/stu。
输出结果:显示当前用户的主目录。
6、cat file1 file2 > cat.out 2> cat.err
cat file1 file2:将文件 file1 和 file2 的内容连接输出。
> cat.out:将标准输出重定向到文件 cat.out。
2> cat.err:将标准错误输出重定向到文件 cat.err。
输出结果:
正常内容写入 cat.out。
错误信息写入 cat.err。
Shell 脚本 定义变量
只包含字母、数字和下划线: 变量名可以包含字母(大小写敏感)、数字和下划线 _,不能包含其他特殊字符。不能以数字开头。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 定义输出变量 your_name="qinjx" echo $your_name echo ${your_name}# 使用变量 for skill in Ada Coffe Action Java; do echo "I am good at ${skill}Script" done# 修改变量,不用$ your_name="tom" echo $your_name your_name="alibaba" echo $your_name# 删除变量 unset variable_name
字符串变量 单引号
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字符串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号 1 2 3 your_name="runoob" str="Hello, I know you are \"$your_name\"! \n" echo -e $str
输出:Hello, I know you are "runoob"!
双引号里可以有变量
双引号里可以出现转义字符
拼接字符串 1 2 3 4 5 6 7 8 9 10 11 12 13 14 your_name="runoob"# 使用双引号拼接 greeting="hello, "$your_name" !" greeting_1="hello, ${your_name} !" echo $greeting $greeting_1# 使用单引号拼接 greeting_2='hello, '$your_name' !' greeting_3='hello, ${your_name} !' echo $greeting_2 $greeting_3# 输出: # hello, runoob ! hello, runoob ! # hello, runoob ! hello, ${your_name} !
获取字符串长度 1 2 3 4 5 string="abcd" echo ${#string} # 输出 4 string="abcd" echo ${#string[0]} # 输出 4
提取子字符串 1 2 string="runoob is a great site" echo ${string:1:4} # 输出 unoo
查找子字符串 1 2 string="runoob is a great site" echo `expr index "$string" io` # 输出 4
数组 1 2 3 4 5 6 7 8 9 # 定义数组 数组名=(值1 值2 ... 值n)# 读取数组 valuen=${array_name[n]}# 使用@获取全部元素 echo ${array_name[@]}# 获取数组的长度 length=${#array_name[@]} length=${#array_name[*]}
Shell 传递参数
$0:文件名
$n:第n个参数1 2 3 4 5 6 7 8 9 10 11 12 13 echo "Shell 传递参数实例!"; echo "执行的文件名:$0"; echo "第一个参数为:$1"; echo "第二个参数为:$2"; echo "第三个参数为:$3";# 输出 $ chmod +x test.sh $ ./test.sh 1 2 3 Shell 传递参数实例! 执行的文件名:./test.sh 第一个参数为:1 第二个参数为:2 第三个参数为:3
参数处理
说明
$#
传递到脚本的参数个数
$*
以一个单字符串显示所有向脚本传递的参数。如”$*“用「”」括起来的情况、以”$1 $2 … $n”的形式输出所有参数。
$$
脚本运行的当前进程ID号
$!
后台运行的最后一个进程的ID号
$@
与$*相同,但是使用时加引号,并在引号中返回每个参数。如”$@”用「”」括起来的情况、以”$1” “$2” … “$n” 的形式输出所有参数。
$-
显示Shell使用的当前选项,与set命令功能相同。
$?
显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
1 2 3 4 5 6 7 8 9 10 11 12 echo "Shell 传递参数实例!"; echo "第一个参数为:$1"; echo "参数个数为:$#"; echo "传递的参数作为一个字符串显示:$*";# 结果 $ chmod +x test.sh $ ./test.sh 1 2 3 Shell 传递参数实例! 第一个参数为:1 参数个数为:3 传递的参数作为一个字符串显示:1 2 3
$* 与 $@ 区别:
相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,则 “ * “ 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。
Shell 基本运算符 算数运算符
运算符
说明
举例
+
加法
`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。
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 a=10 b=20 val=`expr $a + $b` echo "a + b : $val" val=`expr $a - $b` echo "a - b : $val" val=`expr $a \\* $b` echo "a * b : $val" val=`expr $b / $a` echo "b / a : $val" val=`expr $b % $a` echo "b % a : $val" if [ $a == $b ] then echo "a 等于 b" fi if [ $a != $b ] then echo "a 不等于 b" fi# 输出 a + b : 30 a - b : -10 a * b : 200 b / a : 2 b % a : 0 a 不等于 b
乘号(*)前边必须加反斜杠(\)才能实现乘法运算;
关系运算符
运算符
说明
举例
-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。
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 # !/bin/bash a=10 b=20 if [ $a -eq $b ] then echo "$a -eq $b : a 等于 b" else echo "$a -eq $b: a 不等于 b" fi if [ $a -ne $b ] then echo "$a -ne $b: a 不等于 b" else echo "$a -ne $b : a 等于 b" fi if [ $a -gt $b ] then echo "$a -gt $b: a 大于 b" else echo "$a -gt $b: a 不大于 b" fi if [ $a -lt $b ] then echo "$a -lt $b: a 小于 b" else echo "$a -lt $b: a 不小于 b" fi if [ $a -ge $b ] then echo "$a -ge $b: a 大于或等于 b" else echo "$a -ge $b: a 小于 b" fi if [ $a -le $b ] then echo "$a -le $b: a 小于或等于 b" else echo "$a -le $b: a 大于 b" fi# 结果 10 -eq 20: a 不等于 b 10 -ne 20: a 不等于 b 10 -gt 20: a 不大于 b 10 -lt 20: a 小于 b 10 -ge 20: a 小于 b 10 -le 20: a 小于或等于 b
布尔运算符
运算符
说明
举例
!
非运算,表达式为 true 则返回 false,否则返回 true。
[ ! false ] 返回 true。
-o
或运算,有一个表达式为 true 则返回 true。
[ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a
与运算,两个表达式都为 true 才返回 true。
[ $a -lt 20 -a $b -gt 100 ] 返回 false。
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 a=10 b=20 if [ $a != $b ] then echo "$a != $b : a 不等于 b" else echo "$a == $b: a 等于 b" fi if [ $a -lt 100 -a $b -gt 15 ] then echo "$a 小于 100 且 $b 大于 15 : 返回 true" else echo "$a 小于 100 且 $b 大于 15 : 返回 false" fi if [ $a -lt 100 -o $b -gt 100 ] then echo "$a 小于 100 或 $b 大于 100 : 返回 true" else echo "$a 小于 100 或 $b 大于 100 : 返回 false" fi if [ $a -lt 5 -o $b -gt 100 ] then echo "$a 小于 5 或 $b 大于 100 : 返回 true" else echo "$a 小于 5 或 $b 大于 100 : 返回 false" fi# 执行脚本,输出结果如下所示: 10 != 20 : a 不等于 b 10 小于 100 且 20 大于 15 : 返回 true 10 小于 100 或 20 大于 100 : 返回 true 10 小于 5 或 20 大于 100 : 返回 false
文件测试运算符
操作符
说明
举例
-d file
检测文件是否是目录,如果是,则返回 true。
[ -d $file ] 返回 false。
-f file
检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。
[ -f $file ] 返回 true。
-r file
检测文件是否可读,如果是,则返回 true。
[ -r $file ] 返回 true。
-w file
检测文件是否可写,如果是,则返回 true。
[ -w $file ] 返回 true。
-x file
检测文件是否可执行,如果是,则返回 true。
[ -x $file ] 返回 true。
-s file
检测文件是否为空(文件大小是否大于0),不为空返回 true。
[ -s $file ] 返回 true。
-e file
检测文件(包括目录)是否存在,如果是,则返回 true。
[ -e $file ] 返回 true。
变量 file 表示文件 /var/www/runoob/test.sh,它的大小为 100 字节,具有 rwx 权限。下面的代码,将检测该文件的各种属性: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 # !/bin/bash file="/var/www/runoob/test.sh" if [ -r $file ] then echo "文件可读" else echo "文件不可读" fi if [ -w $file ] then echo "文件可写" else echo "文件不可写" fi if [ -x $file ] then echo "文件可执行" else echo "文件不可执行" fi if [ -f $file ] then echo "文件为普通文件" else echo "文件为特殊文件" fi if [ -d $file ] then echo "文件是个目录" else echo "文件不是个目录" fi if [ -s $file ] then echo "文件不为空" else echo "文件为空" fi if [ -e $file ] then echo "文件存在" else echo "文件不存在" fi# 输出 文件可读 文件可写 文件可执行 文件为普通文件 文件不是个目录 文件不为空 文件存在
自增和自减操作符
使用let:1 2 3 4 5 6 7 8 # !/bin/bash # 初始化变量 num=5# 自增 let num++# 自减 let num-- echo $num
使用expr:1 2 3 4 5 6 7 8 # !/bin/bash # 初始化变量 num=5# 自增 num=$(expr $num + 1)# 自减 num=$(expr $num - 1) echo $num
if 1 2 3 4 5 6 7 8 9 if condition1then command1elif condition2 then command2else commandNfi
for循环 1 2 3 4 5 6 7 for var in item1 item2 ... itemN do command 1 command 2 ... command N done
while循环 1 2 3 4 while conditiondo command done
函数 无参函数 1 2 3 4 5 6 demoFun(){ echo "这是我的第一个 shell 函数!" } echo "-----函数开始执行-----" demoFun echo "-----函数执行完毕-----"
含参函数 1 2 3 4 5 6 7 8 9 10 funWithParam(){ echo "第一个参数为 $1 !" echo "第二个参数为 $2 !" echo "第十个参数为 $10 !" echo "第十个参数为 ${10} !" echo "第十一个参数为 ${11} !" echo "参数总数有 $# 个!" echo "作为一个字符串输出所有参数 $* !" } funWithParam 1 2 3 4 5 6 7 8 9 34 73
返回值函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # !/bin/bash # author:菜鸟教程 # url:www.runoob.com funWithReturn(){ echo "这个函数会对输入的两个数字进行相加运算..." echo "输入第一个数字: " read aNum echo "输入第二个数字: " read anotherNum echo "两个数字分别为 $aNum 和 $anotherNum !" return $(($aNum+$anotherNum)) } funWithReturn echo "输入的两个数字之和为 $? !" # 返回值使用$?获取
Shell脚本例子 输出文件行数 1 2 3 4 5 6 7 8 9 10 11 12 13 if [ $# -ne 1 ] ; then # $#指当前参数数目 echo "[Usage: $0 <file name>]" # $0指当前文件名 exit 1 # 1表示出现错误 fi lineCount=0 while read line do lineCount=$((lineCount+1)) done < $1 # <表示输出重定向,将参数的内容传给while循环 echo "file $1 $lineCount lines" exit 0 # 0表示正常退出
查看对应目录文件个数 1 2 3 4 5 6 7 8 9 10 11 cd /var/log sum=0 for i in `ls -r *` do if [ -f $i ]; then sum=$((sum+1)) echo "文件名: $i" fi done echo "总文件数量为:$sum" exit 0
删除当前目录大小为0的普通文件 1 2 3 4 5 6 7 8 9 10 11 rmFileCount=0 for filename in `ls -r *` do if [ ! -s $filename -a -f $filename ] # -s $filename:判断文件是否非空。! -s $filename:表示文件为空(大小为 0)。-f $filename:判断是否为普通文件。-a:逻辑与。 then rm -f $filename 2>/dev/null # 强制删除不提示,错误信息重定向到/dev/null,表示不保存错误信息 rmFileCount=$((rmFileCount+1)) fi done echo "$rmFileCount file deleted" exit 0
判断是否是闰年 1 2 3 4 5 6 7 8 9 10 11 12 13 14 read -p "请输入一个年份:" year if [ "$year" = "" ]; then echo "没有输入年份" exit -1 fi if [ $[year % 4] -eq 0 ] && [ $[year % 100] -ne 0 ]; then echo "$year年是闰年" elif [ $[year % 400] -eq 0 ]; then echo "$year年是闰年" else echo "$year年不是闰年" fi
判断是否是素数 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 # !/bin/bash # 提示用户输入一个数 read -p "请输入一个整数: " num# 如果输入为空或不是正整数,退出 if [ -z "$num" ] || ! [[ "$num" =~ ^[0-9]+$ ]]; then echo "请输入一个正整数" exit 1 fi# 特殊情况:1 不是素数 if [ "$num" -le 1 ]; then echo "$num 不是素数" exit 0 fi# 判断是否为素数 is_prime=1 # 假设是素数 for ((i=2; i*i<=num; i++)) do if [ $((num % i)) -eq 0 ]; then is_prime=0 break fi done# 输出结果 if [ $is_prime -eq 1 ]; then echo "$num 是素数" else echo "$num 不是素数" fi exit 0