Frequently Asked Question(FAQ)
1.为什么#!/bin/bash必须出现在脚本的第一行?
#!表明,这是一个脚本,需要由另外的程序来解释执行,而不是直接执行,这一行的剩余部分被视作解释器
2.如何获取当前shell的名称?
执行以下的命令就可以了
$echo $0
3.如何了解当前shell是交互的还是非交互的?
编写如下脚本
case $-in *i*)echo"it is interactive";; *)echo"it is noninteractive';;
esac
再运行就可以了
4.如何丢掉命令的输出?
你可以将这些输出重定向到/dev/null文件就可丢掉了
cmd > /dev/null
example:
discard the grep's value(丢掉grep的值)
if grep soda /etc/hosts > dev/null ;then
echo "the soda found!"
fi
要丢掉命令的输出和它的出错,可以将它标准错误输出(文件描述符2)重定向到标准输出(文件描述符1),再将STD重定向到/dev/null
cmd > /dev/null 2>&1
if grep soda /etc/hosts > dev/null 2>&1;then
echo "the soda found!"
fi
5.如何向STDERR显示信息?
echo msg 1>&2
msg is abbreviate with message
6.如何判断命令是否执行成功?
if [ $? -eq 0 ]; then
echo "it is success"
else "it is failure"
fi
7. 如何判断shell是否能够成功地找到某个特定的命令?
if type cmd > /dev/null 2>&1; then
echo "had finded"
else "not found"
fi
8.可以使用&&和|| 操作符来条件地执行命令吗?
如:确定一个目录的绝对路径
path()
{
cd "$1" && pwd
}
9.将参数一次传递一个给shell脚本,可能吗?
用for循环来实现
for arg in $@
do
commads
echo $arg
done
10.如何将传递给脚本的参数,传递给另一个变量?
cmd=$@
11.如何将命令的输出存储在变量中?
可以使用=和``来完成
variable=`cmd`
如:DATE=`date`
12.如何检查一个变量是否为空?
可用if来实现
if [ -z "variable" ]
then echo "it is null"
else printf "it is non null\n"
fi
13.如何判断一个目录的路径名?
PATHS=`cd dir 2>/dev/null && pwd`
14.用什么命令可以将有的*.aaa文件改名为*.bbb?
rename *.aaa *.bbb
可用mv命令,但一次只能一个,所以还得用for
OSUFFIX=aaa
NEWSUFFIX=bbb
for FILE in *."$OSUFFIX"
do
NEWNAME=`echo "$FILE"|sed -e "s/$OSUFFIX\$/$NEWSUFFIX/"`
mv -i "$FILE" "NEWNAME"
done
首先生成当前目录下以变量OSUFFIX结尾的文件的清单,然后使用sed将每个文件名的OSUFFIX替换成NEWSUFFIX。在sed表达式中使用了$字符来定位OSUFFIX到一行的结尾的位置,这就确保了替换的模式是文件名的后缀。在获得了新的文件名后,就可以将保存在FILE中的原始文件名更名为NEWNAME中的新文件名了
15.如何将文件名变为小写?
可以使用下面的命令
for FILE in *
do
mv -i "$FILE" `echo $FILE|tr '[A-Z]' '[a-z]'` 2> /dev/null
done
16.用什么命令可以将有的aaa*文件改名为bbb*?
rename aaa* bbb*
可用mv命令,但一次只能一个,所以还得用for
OSUFFIX=aaa
NEWSUFFIX=bbb
for FILE in "$OSUFFIX"
do
NEWNAME=`echo "$FILE"|sed -e "s/^$OSUFFIX\$/$NEWSUFFIX/"`
mv -i "$FILE" "NEWNAME"