2021-01-06
- 计算向脚本传递的参数个数
$#
- 在脚本中获取脚本的名称
$0
- 检查上一条命令是否执行成功
$? # 值为0说明执行成功,非0则执行失败
- 获取文件最后一行
tail -1 # tail 为显示最后10行
- 获取文件第一行
head -1 # head 为显示前10行
- 向脚本传递参数
./test.sh file.txt
cat test.sh
#!/bin/bash
echo $1
######
输出为:file.txt
- 在脚本中使用传进来的参数
bash copy.sh file.txt /home/
cat copy.sh
#!/bin/bash
cp $1 $2
- 获取一个文件每一行的第三个元素
awk { print $3 } # -F" " 指定分隔符,不写-F的时候默认分隔符为空格
- 找出以“FIRST”开头的行,并获取这些行的第四个元素
awk { if ( $1 == "FIRST") print $4 } #注意{}前后有空格,在命令行使用if时用(),在脚本中用[]
- 调试脚本的方式
# 在解释器后面加 -xv
cat test.sh
#!/bin/bash -xv
- 定义函数,并调用函数
cat aa.sh
#!/bin/bash
function test {
echo "The first func!"
}
test
######
输出结果为:The first func!
- 连接两个字符串
# 变量在赋值时,等号左右两边不能有空格,与python的格式有区别
a='haha '
b='kk'
c=$a$b
echo $c
######
输出结果为:haha kk
- 两数相加
a=5
b=6
法1:let c=$a+$b
echo $c
法2:echo $[$a+$b] (常用)
######
输出结果为:11
- 检查文件系统是否存在某个文件
if [ -f /var/log/messages ]
then
echo "file exists"
fi
######
输出结果为:file exists
- for循环语法
for i in $(ls);
do
echo "item:$i"
done
例子:循环输出1到10
法1:
for j in {1..10};
do
echo $j
done
法2:
for k in `seq 1 10`;
do
echo $k
done
# seq 产生指定两个数之间的所有整数,默认间隔为1
seq -5 2 5 # 换行输出-5 到 5 之间的整数,间隔为2
- while循环语法
#!/bin/bash
a=0
while [ $a -lt 10 ];
do
a=$[ $a+1 ]
echo $a
done
# a 的值小于10就+1,并打印+1之后a的值
- until循环语法
# until与while相反,当满足条件时停止循环,不满足条件则执行循环
#!/bin/bash
a=10
until [ $a -lt 5 ];
do
let a-=1
echo $a
done
- 常用解释器
#!/bin/bash
#!/usr/bin/python
- 获取文件第10行
head -10 file | tail -1
- bash 脚本文件的第一个符号是什么
#
- 命令
[ -z "" ] && echo 0 || echo 1
的解释和输出是什么
[-z ''''] 的长度为零则为真,&& 如果符号前面结果为真,就执行符号后面的命令,反之不执行,|| 如果符号前面的结果为真,就不执行后面的命令,反之则执行后面的命令,因此输出为 0
- 命令 “export” 有什么用 ?
使变量在子shell中可用
- 在后台运行脚本
(1)在脚本后面加 $
(2)nohup command&
- chmod 500 test.sh 有什么用
使test.sh 的所有者拥有读权限和执行权限
- ">" 作用
重定向输出流到文件或另一个流
- & 与 && 的区别
&:使脚本在后台运行
&&:符号前一个命令执行成功,则执行符号后面的命令看,反之不执行
- name=kk && echo 'My name is $name' 输出是什么
输出为:My name is $name
正确写法:name=kk && echo "My name is $name",输出为,My name is kk
- echo ${num:-cc} 输出是什么
输出为cc
解析,若num有赋值,则使用num的值,否则使用-后的值,相当于设置默认值
若num=2,则输出为2
-
'
和"
的区别
':强引用,在单引号内的所有内容都被当成字符串
":弱引用,在双引号中可获取变量的值,例子见27
- 在脚本文件中重定向标准输出和标准错误流到 log.txt文件
exec > log.txt 2>&1
- 只用echo获取字符串的一部分
a=variable
echo ${a:0:3}
输出为:vari(注意:空格也占一个位置)
- variable="User:123:321:/home/dir"用echo获取路径
echo ${variable#*:*:*:} 输出为:/home/dir
# 解析:从variable这变量的开头(#)往后截取,*表示任何数据,:表示字符串中的分隔符,需要截取的具体内容在表达式不需要占位符
- variable="User:123:321:/home/dir"用echo获取user这个字段
echo ${variable%*:*:*:} 输出为:User
# 解析:%表示从后面往前截取
- 列出UID小于100的用户
awk -F":" '$3<100' /etc/passwd
35. 写程序为用户计算主组数目 并显示次数和组名
#!/bin/bash
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
36. 如何在bash shell中更改标准的域分隔符为:
IFS=":"
- 获取变量的长度
a="abcd"
echo ${#a}
输出为:4
- 打印变量的最后5个字符
a=abcd
echo ${a: -3} #注意分号后面有空格,没有空格则效果如例28
输出为:bcd
- 用echo替换字符串的一部分
a=aabcd
echo ${a//aa/kk}
输出为:kkbcd
40. 哪个命令将命令替换成大写
tr '[:lower:]' '[:upper:]'
- 计算本地用户数目
cat /etc/passwd | wc -l
- 计算字符串中的单词数量
a="abc kkk lij uh xsjg yugdfc d dsc"
法1:echo $a | wc -w
法2:set ${a}
echo $#
- export $abc 和 export abc 哪种写法正确
export abc
解析:export用于设置和显示环境变量
export -p:列出所有环境变量
- 列出第二个字母是a或b的文件
ls -d ?[ab]*
- 去除字符串中的所有空格
a='jsad iuwef i jgibkh ljv'
echo $a | tr -d " "
解析: tr 命令用于转换(替换)或删除文件中的字符,-d 删除
- 输出数字0到100中3的倍数,用命令行来写
法1:for i in {0..100..3}; do echo $i; done
法2:for (( i=0; i<=100; i=i+3 )); do echo "$i"; done
- 打印传递给脚本的所有参数
echo $* 或 echo $@
- [ b ] 和[ b ]的区别
[ $a == $b ]:用于字符串比较
[ $a -eq $b ]:用于数字比较
- = 和 == 的区别
=:用于变量赋值
==:用于字符串比较
- 测试$a是否大于10
[ $a -gt 10 ]
解析:-gt 大于 -lt 小于 -le 小于等于 -eq 等于
- 检查字符串是否以“abc”开头
[ $string == abc* ]
- [[ string == "abc" ]] 有什么区别
1.检查字符串是否以字母abc开头
2.检查字符串是否完全等于abc
- 列出以ab 或xy 开头的用户名
egrep "^ab|^xy" /etc/passwd | cut -d: -f1
解析:egrep是grep的扩展,支持更多re规则,若改用grep输出为空
- 判断文件夹是否为空
#!/bin/sh
##方法一 判断输出字符数统计为0
is_empty_dir(){
return `ls -A $1|wc -w`
}
##方法二 判断输出string为空
is_empty_dir(){
return $[ -z `ls -A $1` ]
}
if is_empty_dir $1
then
echo " $1 is empty"
else
echo " $1 is not empty"
fi
- 判断文件是否为空,不为空则打印文件大小
#! /bin/bash
if [ -s ./file.sh ] ; then #当文件大于0时,返回True
echo 'ths file is not empyt and file size:'
du -sh file.sh #打印文件大小
else
echo 'empty!'
fi
- $! 表示什么
后台最近执行命令的pid
- $?表示什么
前台最近命令的结束状态
- 显示当前shell的pid
echo $$
- @ 有什么区别
$*:以一个字符串形式输出所有传递到脚本的参数
$@:以$IFS为分隔符列出所有传递到脚本的参数
- 在bash中定义数组
list=("a" "b" "c")
- 打印数组的第一个元素
echo ${list[0]}
- 打印数组的所有元素
echo ${list[@]}
- 输出所有数组索引
echo ${!list[@]}
- 移除数组中索引为2的元素
unset list[2]
- 添加id为3的元素
list[3]="kk"
- 列出shell脚本获取输入的值的方法
法1:bash test.sh a b #a b 为参数传入脚本
法2:read -p "请输入:" variable
执行命令或脚本时需要键盘输入一个参数,这个参数将赋值给variable
- expect的使用(自动交互方法)
/usr/bin/expect << EOD
spawn rsync -ar ${line} ${desthost}:${destpath}
expect "*?assword:*"
send "${password}\r"
expect eof
EOD
- 用户登录Linux需要执行的文件(有顺序)
/etc/profile--->(~/.bash_profile ) ---> ~/.bashrc ---> /etc/bashrc
- 获取系统当前时间(年月日时分秒)
date +%Y-%m-%d_%H:%M:%S
网友评论