shell的菜鸟入门知识

shell的初学者入门知识
  shell判断文件,目录是否存在或者具有权限

0
推荐
#!/bin/sh

myPath="/var/log/httpd/"
myFile="/var /log/httpd/access.log"

#这里的-x 参数判断$myPath是否存在并且是否具有可执行权限
if [ ! -x "$myPath"]; then
mkdir "$myPath"
fi

#这里的-d 参数判断$myPath是否存在
if [ ! -d "$myPath"]; then
mkdir "$myPath"
fi

#这里的-f参数判断$myFile是否存在
if [ ! -f "$myFile" ]; then
touch "$myFile"
fi

#其他参数还有-n,-n是判断一个变量是否是否有值
if [ ! -n "$myVar" ]; then
echo "$myVar is empty"
exit 0
fi

#两个变量判断是否相等
if [ "$var1" = "$var2" ]; then
echo '$var1 eq $var2'
else
echo '$var1 not eq $var2'
fi
###################################################
shell中的变量展开:
*** 参数展开 ***
参数展开(parameter expansion)是Shell提供变量值在程序中的使用过程;例如作为给新变量的值,或是作为命令行的部分或全部参数。最简单的形式如下所示:
reminder=”Time to go home”  将值存储在reminder中
sleep 120                   等待两分钟
echo $reminder              显示信息

在Shell下,有更复杂的形式可用于更特殊的情况。这些形式都是将变量名称括在花括号里(${variable}),然后再增加额外的语法以告诉Shell做什么。

注意:在默认情况下,未定义的变量会展开为null字符串。程序随便乱写,就可能会导致灾难发生:
rm -fr /$MYPROGRAM      如果未设置MYPROGRAM,就会有很大的麻烦了
所以,写程序时一定要保持清醒的头脑。

*** 展开运算符 ***
第一组字符串处理运算符用来测试变量的存在状态,且为在某种情况下允许默认值的替换。

${varname:-word}    如果varname存在且为非null,则返回其值;否则,返回word。
用途:如果变量未定义,则返回默认值。
范例:如果count未定义,则${count:-0}的值为0。

${varname:=word}    如果varname存在且不是null,则返回它的值;否则,设置它为word,并返回其值。
用途:如果变量未定义,则设置变量为默认值。
范例:如果count未定义,则${count:=0}设置count为0。

${varname:?message} 如果varname存在且非null,则返回它的值;否则显示varname:message,并退出当前命令或脚本。省略message会出现默认信息parameter null or not set。
用途:为了捕捉由于变量未定义所导致的错误。
范例:如果count未定义。则${count:?”undefined!”}将显示count: undefined!,并退出脚本。

${varname:+word}    如果varname存在且非null,则返回word;否则,返回null。
用途:用来测试变量的存在。
范例:如果count已定义,则${count:+1}返回1(也就是“真”)。

注:上述的四个运算符内的冒号都是可选的。如果省略冒号,则将每个定义中的“存在且非null“部分改为”存在“,也就是说,运算符仅仅测试变量是否存在。

*** 模式匹配运算符 ***

以下所有示例中均假设path的初始值为“/home/michael/bin/imailcheck.v1.sh”

${variable#pattern}    如果模式匹配于变量的开头处,则删除匹配的最短部分,并返回剩下的部分。

[11 michael@15:17:25 ~]$ echo ${path#/*/}
michael/bin/imailcheck.v1.sh

${variable##pattern}   如果模式匹配于变量的开头处,则删除匹配的最长部分,并返回剩下的部分。

[13 michael@15:20:08 ~]$ echo ${path##/*/}
imailcheck.v1.sh

${variable%pattern}     如果模式匹配于变量的结尾处,则删除匹配的最短部分,并返回剩下的部分。

[17 michael@15:26:15 ~]$ echo ${path%.*}
/home/michael/bin/imailcheck.v1

${variable%%pattern}   如果模式匹配于变量的结尾处,则删除匹配的最长部分,并返回剩下的部分。

[18 michael@15:26:17 ~]$ echo ${path%%.*}
/home/michael/bin/imailcheck

最后,POSIX标准化字符串长度运算符:${#variable}返回$variable值里的字符长度:

[20 michael@15:30:02 ~]$ x=helloword
[21 michael@15:39:35 ~]$ echo There are ${#x} characters in $x
There are 9 characters in helloword

*** 位置参数 ***

所谓位置参数,指的是Shell脚本的命令行参数;同时也表示在Shell函数内的函数参数。它们的名称是以单个的整数来命名。当这个整数大于9时,就应当用花括号({})括起来。

下面介绍的特殊“变量”提供了对传递的参数的总数的访问,以及一次对所有参数的访问:
$#      提供传递到Shell脚本或函数的参数总数。当你是为了处理选项和参数而建立循环时,它会很有用。

while [ $# != 0 ]
do
case $1 in

esac
shift
done

$*, $@  一次表示所有的命令行参数。这两个参数可用来把命令行参数传递给脚本或函数所执行的程序。

“$*”    将所有的命令行视为单个字符串。等同于”$1 $2 …”。

“$@”    将所有的命令行参数视为单独的个体,也就是单独字符串。等同于”$1″ “$2“ …。
查看源代码
打印帮助
01 [23 michael@16:15:39 ~]$ set -- hello "hi there" greetings
02 [24 michael@16:16:00 ~]$ echo there are $# total arguments
03 there are 3 total arguments
04 [25 michael@16:16:17 ~]$ for i in $*
05 > do echo i is $i
06 > done
07 i is hello
08 i is hi
09 i is there
10 i is greetings
11 [26 michael@16:16:36 ~]$ for i in $@
12 > do echo i is $i
13 > done
14 i is hello
15 i is hi
16 i is there
17 i is greetings
18 [27 michael@16:16:54 ~]$ for i in "$*"
19 > do echo i is $i
20 > done
21 i is hello hi there greetings
22 [28 michael@16:17:21 ~]$ for i in "$@"
23 > do echo i is $i
24 > done
25 i is hello
26 i is hi there
27 i is greetings
28 [29 michael@16:17:40 ~]$ shift
29 [30 michael@16:18:08 ~]$ echo there are now $# arguments
30 there are now 2 arguments
31 [31 michael@16:18:18 ~]$ for i in "$@"
32 > do echo i is $i
33 > done
34 i is hi there
35 i is greetings

*** 其它常见特殊变量 ***
#       目前进程的参数个数
@       传递给当前进程的命令行参数。置于双引号内,会展开为个别的参数。
*       当前进程的命令行参数。置于双引号内,则展开为单独参数。
-       在引用时给予Shell的选项
?       前一命令的退出状态
$       Shell进程的PID
0       Shell程序的名称
HOME    登陆目录
IFS     内部的字段分隔符;例如作为单词分隔器的字符列表。一般设置为空格,制表符,以及换行符。
PATH    命令的查找路径
PPID    父进程的进程编号
PWD     当前的工作目录
#######################################################

例子 rename 's/\.bak$//' *.bak 是将所有文件的.bak扩展去除

例子 rename 'y/A-Z/a-z/' * 是将所有文件中的大写字母转为小写

#######################################################


1   while read line
2   do
3    $echo $line
4   done < in.txt