shell脚本面试
1)传参:
形式参数: $1 第一个参数 $# 计算传递进来的参数的个数 $0 获取脚本名称: $? 检查之前的命令是否运行成功,前台最近命令的结束状态
$$ 输出当前shell的PID$!后台最近执行命令的 PIDshell脚本如何获取输入的值
1) 通过参数
./script param1 param2
2) 通过read命令
read -p "Destination backup Server : " desthost
2)文本命令
tail -1 获取文件的最后一行 head -1 获取文件的第一行 more less
head -10 file|tail -1 获取文本文件的第 10 行
egrep "^ab|^xy" /etc/passwd|cut -d: -f1 列出以ab或xy开头的用户名
3) 调试脚本
将 -xv 参数加到 #!/bin/bash 后 调试bash脚本
nohup command& 在后台运行脚本export使变量在子shell中可用,用法:export variable
4)awk
awk '{print $3}' 获取一个文件每一行的第三个元素 awk '{ if ($1 == "FIND") print $2}' 文件中每行第一个元素是 FIND,如何获取第二个元素
使用awk列出 UID 小于 100 的用户
awk -F: '$3<100' /etc/passwd
5)函数
function example { echo "Hello world!" } example
5)字符串相加与计算
V3=${V1}${V2} 连接两个字符串 1.两个整数进行相加 let V3=$V1+$V2 方法 1 echo $(($A+$B)) 方法 2 echo $[$A+$B] 方法 3 expr $A + $B 方法 4 echo $A+$B | bc 方法 5 awk 'BEGIN{print '"$A"'+'"$B"'}' # 方法 6
2.将整数 a 加到 b 并赋值给 cc=$((a+b))或c=`expr $a + $b`或c=`echo "$a+$b"|bc`3.列出第二个字母是 a 或 b 的文件ls -d ?[ab]*
6)字符串截取
1.只用 echo 命令获取字符串变量的一部分 echo ${variable:x:y} x - 起始位置 y - 长度 示例: variable="My name is Petras, and I am developer." echo ${variable:11:6} # 会显示 Petras
2.如果给定字符串 variable="User:123:321:/home/dir",如何只用 echo 命令获取 home_dir ?
echo ${variable#*:*:*:}
或
echo ${variable##*:}
从左匹配删除 # 和 ##
${string#mact_string}:从 string 左边开始匹配,删除匹配到的字符,尽可能少删除字符
${string##mact_string}:从 string 左边开始匹配,删除匹配到的字符,尽可能多删除字符
3.如何从上面的字符串中获取 “User” ?
echo ${variable%:*:*:*}
或
echo ${variable%%:*}
从右匹配删除 % 和 %%
4.去除字符串中的所有空格
echo $string|tr -d " "
从左边截取
${string:position:length} :从字符串 string 的 position 位置截取 length 个字符串
从右边截取
${string:空格 -lenth} 截取字符串 string 的后 lenth 个位置
#1-4就相当于 空格-3 或者说 0-3
前后缀替换
${string/#match_string/replace_string}:将 string 中第一个 match_string 替换成 replace_string
${string/%match_string/replace_string}:将 string 中的 match_string 全部替换成 replace_string
普通替换
${string/match_string/replace_string}:将 string 中第一个 match_string 替换成 replace_string
${string//match_string/replace_string}:将 string 中的 match_string 全部替换成 replace_string
7)脚本
1.检查文件系统中是否存在某个文件 if [ -f /var/log/messages ];then echo "File exists" fi
2.'' 和 "",单双引号区别> name=John && echo 'My name is $name' 的输出是什么My name is $name
不希望把变量转换为值使用单引号''
会计算所有变量的值并用值代替,双引号""
3.在脚本文件中重定向标准输出和标准错误流到log.txt文件exec >log.txt 2>&1
4.其余表示脚本使用
#!/bin/bash/bin/bash,进行声明。对于 python 脚本,就是#!/usr/bin/python。
[ -z "" ] && echo 0 || echo 1 输出为0&&当前一个脚本成功完成才执行后面的命令/脚本的时候使用它
> 输出重定向,>> 追加内容到文本中bash shell脚本中用#注释
不用 wc 命令如何计算字符串中的单词数目:set${string}echo$#
5.检查字符串是否以字母"abc"开头
[[ $string == abc* ]]
6.字符串或者数值大小$b是否小于等于 12 的命令
[ $b -le 12 ]
数值比较大小:
-le 小于
-gt 大于
-eq 等于
字符串比较:=用于为变量赋==用于字符串比较
7.写出输出数字 0 到 100 中 3 的倍数(0 3 6 9 …)的命令for i in {0..100..3}; do echo $i; done
或者for (( i=0; i<=100; i=i+3 )); do echo "Welcome $i times"; done
或者for i in`seq 1 3 100`; do echo $i; done重写这个命令,将输出变量转换为复数:
8.item="car"; echo "I like $item"?item="car"; echo "I like ${item}s"
8)循环语法
for循环 #!/bin/bash for i in $(ls);do echo item:$i done while循环 #!/bin/bash counter=0 while [ $counter -lt 10 ]; do echo The counter is $COUNTER let COUNTER=COUNTER+1 done util循环 #!/bin/bash counter=20 until [ $counter -lt 10 ]; do echo COUNTER $COUNTER let COUNTER-=1 done
9)数组
定义数组: array=("Hi" "my" "name" "is") 在数组中添加 id 为 333 的元素: array[333]="New_element" 移除数组中索引为 2 的元素: unset array[2] 打印数组的第一个元素 echo ${array[0]} 打印数组的所有元素 echo ${array[@]} 输出所有数组索引: echo ${!array[@]}$*和$@有什么区别$*以一个字符串形式输出所有传递到脚本的参数;会将所有的参数从整体上看做一份数据$@以 $IFS 为分隔符列出所有传递到脚本中的参数
10、其余
1.计算本地用户数目 wc -l /etc/passwd|cut -d" " -f1 2.将命令替换为大写 cat testfile | tr '[:lower:]' '[:upper:]' cat testfile | tr a-z A-Z #转换后的输出 eg:echo root | tr '[:lower:]' '[:upper:]' 3.${variable:-10} 和 ${variable: -10} 有什么区别? ${variable:-10} - 如果之前没有给 variable 赋值则输出 10;如果有赋值则输出该变量 ${variable: -10} - 输出 variable 的最后 10 个字符 4.打印变量的最后 5 个字符 echo ${variable: -5} 5.获取变量长度 ? ${#variable} 6.在 bash shell 中更改标准的域分隔符为 ":" ? IFS=":" 7.为用户计算主组数目并显示次数和组名 cat /etc/passwd|cut -d: -f4|sort|uniq -c|while read c g do { echo $c; grep :$g: /etc/group|cut -d: -f1; }|xargs -n 2 done
浙公网安备 33010602011771号