[root@blog ~ 22:37:37]$ll /etc/init.d/network
-rwxr-xr-x. 1 root root 6643 Sep 12 2016 /etc/init.d/network
[root@blog ~ 22:43:18]$ln -sf /etc/init.d/network /tmp/network_symlink
[root@blog ~ 22:44:25]$ll /tmp/network_symlink
lrwxrwxrwx 1 root root 19 Apr 4 22:44 /tmp/network_symlink -> /etc/init.d/network
[root@blog ~ 22:44:37]$[ -h /tmp/network_symlink ]
[root@blog ~ 22:45:04]$echo $?
0
[root@blog ~ 22:45:06]$[ -h /tmp/network_symlink1 ]
[root@blog ~ 22:45:10]$echo $?
1
[root@blog ~ 22:45:13]$ll -ld /tmp/network_symlink
lrwxrwxrwx 1 root root 19 Apr 4 22:44 /tmp/network_symlink -> /etc/init.d/network
[root@blog ~ 22:45:39]$ll -l /tmp/network_symlink
lrwxrwxrwx 1 root root 19 Apr 4 22:44 /tmp/network_symlink -> /etc/init.d/network
[root@blog ~ 22:45:49]$ll -ld /tmp/network_symlink
lrwxrwxrwx 1 root root 19 Apr 4 22:44 /tmp/network_symlink -> /etc/init.d/network
[root@blog ~ 22:45:53]$res = $(ls -ld /tmp/network_symlink)
bash: res: command not found...
Similar command is: \'rec\'
[root@blog ~ 22:46:17]$res=$(ls -ld /tmp/network_symlink)
[root@blog ~ 22:46:29]$echo $res
lrwxrwxrwx 1 root root 19 Apr 4 22:44 /tmp/network_symlink -> /etc/init.d/network
[root@blog ~ 22:46:32]$exp
expand export exportfs expr
[root@blog ~ 22:46:32]$expr "$res" : \'.*-> \(.*\)$\'
/etc/init.d/network
[root@blog ~ 22:48:17]$real_path=`expr "$res" : \'.*-> \(.*\)$\'`
[root@blog ~ 22:49:14]$echo $real_path
/etc/init.d/network
[root@blog ~ 22:49:20]$expr "$real_path" : \'/.*\'
19
[root@blog ~ 22:49:40]$expr "$real_path_" : \'/.*\'
0
[root@blog ~ 22:50:27]$expr "${real_path}_" : \'/.*\'
20
[root@blog ~ 22:50:45]$expr "${real_path}_" : \'/.*\' > /dev/null
[root@blog ~ 22:51:28]$echo $?
expr argument operator argument
一般的用法是使用expr做算术运算,如:
[root@centos ~]# expr 10 + 20
30
$expr 30 / 3 / 2
5
(注意运算符左右都有空格 ,如果没有空格表示是字符串连接)
使用乘号时,必须用反斜线屏蔽其特定含义。因为shell可能会误解显示星号的意义。如:
[root@centos ~]# expr 10 * 10 //:错误,
expr: syntax error
[root@centos ~]# expr 10 \* 10 //正确
100
2.利用expr,把输出导入/dev/null,可以作判断。
如果表达式成功,可以如下表示:
$value=12
$expr $value + 10 > /dev/null 2>&1
$echo $?
0
如果表达式失败,返回非0值
$value=hello
$expr $value + 10 > /dev/null 2>&1
$echo $?
2
3.expr也操作用于字符串
字符串比较:
expr 如果成功,返回值1,任何其他值为无效或错误。如下面的例子测试两个字符串是否相等,这里字符串为“hello”和hello”。
$value=hello
$expr $value = "hello"
1
#这时候shell的返回值为0。
$echo $?
0
4.expr的模式匹配:
关于expr模式匹配,可以使用expr通过指定冒号:选项指定要进行字符串模式匹配。 .*代表任
何字符重复0次或多次。返回值为括号中的内容.
如在tomcat的catalina.sh,使用了expr的模式匹配来获取连接文件的真实路径,例子如下:
# resolve links - $0 may be a softlink
PRG="$0"
while [ -h "$PRG" ]; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : \'.*-> \(.*\)$\'` #这里expr的返回值为连接文件的真实路径
if expr "$link" : \'/.*\' > /dev/null; then #路径名返回1
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link"
fi
done