“Shell之提取文件名和目录名的一些方法”与“Shell判断文件是否存在”:页面之间的差异

来自linuxsa wiki
(页面间差异)
跳转到导航 跳转到搜索
Evan留言 | 贡献
导入1个版本
 
Evan留言 | 贡献
 
第1行: 第1行:
== 一、使用${} 变量替换扩展 ==
<pre>
===1、${var##*/} 提取出文件名===
我用应用 判断有更新包才更新
<pre>该命令的作用是去掉变量var从左边算起的最后一个'/'字符及其左边的内容,返回从左边算起的最后一个'/'(不含该字符)的右边的内容。使用例子及结果如下:
if [ ! -f "/update/warpack/read_interface.war" ]; then
evan@evanpc:~$ var=/data/test.txt
echo "not read warpack exit now"
evan@evanpc:~$ echo ${var##*/}
exit 1
test.txt
fi
从运行结果可以看到,使用该命令,可以提取出我们需要的文件名file.txt。
若使用时在shell程序文件中,可以使用变量来保存这个结果,再加以利用,如file=${var##*/}</pre>


===2、${var##*.} 提取出文件名后缀===
<pre>该命令的作用是去掉变量var从左边算起的最后一个'.'字符及其左边的内容,返回从左边算起的最后一个'.'(不含该字符)的右边的内容。使用例子及结果如下:
[root@bak hosts]# var=eg.conf
[root@bak hosts]#echo ${var##*.}
conf
从运行结果可以看到,使用该命令,可以提取出我们需要的文件后缀。
如果文件的后缀不仅有一个,例如,file.tar.gz,命令${var##*.}仅能提取最后一个后缀,而我想提取tar.gz时该怎么办?那么就要用下面所说的${var#*.}命令了。</pre>


===3、${var#*.} 提取出文件名有多个点的后缀===
. shell判断文件,目录是否存在或者具有权限
<pre>该命令的作用是去掉变量var从左边算起的第一个'.'字符及其左边的内容,返回从左边算起第一个'.'(不含该字符)的右边部分的内容。使用例子及结果如下:
2. #!/bin/sh
evan@evanpc:~$ var=/data/test.tar.bz2
3.
evan@evanpc:~$ echo ${var#*.}
4. myPath="/var/log/httpd/"
tar.bz2
5. myFile="/var /log/httpd/access.log"
从运行结果可以看到,使用该命令,可以提取出文件的多个后缀。</pre>
6.
7. # 这里的-x 参数判断$myPath是否存在并且是否具有可执行权限
8. if [ ! -x "$myPath"]; then
9. mkdir "$myPath"
10. fi
11.
12. # 这里的-d 参数判断$myPath是否存在
13. if [ ! -d "$myPath"]; then
14. mkdir "$myPath"
15. fi
16.  
17. # 这里的-f参数判断$myFile是否存在
18. if [ ! -f "$myFile" ]; then
19. touch "$myFile"
20. fi
21.  
22. # 其他参数还有-n,-n是判断一个变量是否是否有值
23. if [ ! -n "$myVar" ]; then
24. echo "$myVar is empty"
25. exit 0
26. fi
27.
28. # 两个变量判断是否相等
29. if [ "$var1" = "$var2" ]; then
30. echo '$var1 eq $var2'
31. else
32. echo '$var1 not eq $var2'
33. fi


=== 4、${var%/*} 提取文件所在的目录===
<pre>该命令的使用是去掉变量var从右边算起的第一个'/'字符及其右边的内容,返回从右边算起的第一个'/'(不含该字符)的左边的内容。使用例子及结果如下:
evan@evanpc:~$ var=/data/test.tar.bz2
evan@evanpc:~$ echo ${var%/*}
/data </pre>


=== 5、${var%%.*}  ===
</pre>
<pre>该命令的使用是去掉变量var从右边算起的最后一个'.'字符及其右边的内容,返回从右边算起的最后一个'.'(不含该字符)的左边的内容。使用例子及结果如下:
evan@evanpc:~$ var=/data/love/file.txt
evan@evanpc:~$ echo ${var%%.*}
/data/love/file
当我们需要建立一个与文件名相同名字(没有后缀)的目录与对应的文件相对应时,就可以使用该命令来进行操作。例如,解压文件的情况就与此类似,我们压缩文件file.zip时,会在与file.zip同级目录下建立一个名为file的目录。</pre>


===6、${}总结===
=see also=
<pre>其实${}并不是专门为提取文件名或目录名的,它的使用是变量的提取和替换等等操作,它可以提取非常多的内容,并不一定是上面五个例子中的'/'或'.'。也就是说,上面的使用方法只是它使用的一个特例。
[https://www.cnblogs.com/emanlee/p/3583769.html shell bash判断文件或文件夹是否存在]


看到上面的这些命令,可能会让人感到非常难以理解和记忆,其实不然,它们都是有规律的。
[https://blog.csdn.net/yabingshi_tech/article/details/48548855  如何在shell中判断一个文件是否为空]
#:表示从左边算起第一个
%:表示从右边算起第一个
##:表示从左边算起最后一个
%%:表示从右边算起最后一个
换句话来说,#总是表示左边算起,%总是表示右边算起。


*:表示要删除的内容,对于#和##的情况,它位于指定的字符(例子中的'/'和'.')的左边,表于删除指定字符及其左边的内容;对于%和%%的情况,它位于指定的字符(例子中的'/'和'.')的右边,表示删除指定字符及其右边的内容。这里的'*'的位置不能互换,即不能把*号放在#或##的右边,反之亦然。
[https://blog.csdn.net/haixin1109/article/details/21632025  shell判断文件是否为空]
 
[[category:shell]]
例如:${var%%x*}表示找出从右边算起最后一个字符x,并删除字符x及其右边的字符。
 
看到这里,就可以知道,其实该命令的用途非常广泛,上面只是指针文件名和目录名的命名特性来进行提取的一些特例而已。</pre>
 
 
==二、basename和dirname==
${}并不是专门为提取文件名和目录名设计的命令,那么basename和dirname命令就是专门为做这一件事而已准备的了。
 
 
=== 1、basename ===
<pre>该命令的作用是从路径中提取出文件名,使用方法为basename NAME [SUFFIX]。
1)从路径中提出出文件名(带后缀),例子如下:
evan@evanpc:~$ var=/data/love/file.txt
evan@evanpc:~$ echo $(basename $var)
file.txt </pre>
 
===2、dirname===
<pre>该命令的作用是从路径中提取出目录名,使用方法为 dirname NAME
使用例子如下:
evan@evanpc:~$ var=/data/love/file.txt
evan@evanpc:~$ dirname $var
/data/love
 
注:该命令不仅能提取出普通文件所的目录,它能提取出任何文件所在的目录,例如目录所在的目录,如下:
evan@evanpc:~$ var=/data/love/
evan@evanpc:~$ dirname $var
/data
 
它提取出了目录love所在的目录date.</pre>
 
 
 
http://blog.csdn.net/ljianhui/article/details/43128465
 
 
[[category:shell]]

2022年1月31日 (一) 10:32的最新版本

我用应用 判断有更新包才更新 
if [ ! -f "/update/warpack/read_interface.war" ]; then
echo "not read warpack exit now"
exit 1
fi 


. shell判断文件,目录是否存在或者具有权限 
2. #!/bin/sh 
3. 
4. myPath="/var/log/httpd/" 
5. myFile="/var /log/httpd/access.log" 
6. 
7. # 这里的-x 参数判断$myPath是否存在并且是否具有可执行权限 
8. if [ ! -x "$myPath"]; then 
9. mkdir "$myPath" 
10. fi 
11. 
12. # 这里的-d 参数判断$myPath是否存在 
13. if [ ! -d "$myPath"]; then 
14. mkdir "$myPath" 
15. fi 
16. 
17. # 这里的-f参数判断$myFile是否存在 
18. if [ ! -f "$myFile" ]; then 
19. touch "$myFile" 
20. fi 
21. 
22. # 其他参数还有-n,-n是判断一个变量是否是否有值 
23. if [ ! -n "$myVar" ]; then 
24. echo "$myVar is empty" 
25. exit 0 
26. fi 
27. 
28. # 两个变量判断是否相等 
29. if [ "$var1" = "$var2" ]; then 
30. echo '$var1 eq $var2' 
31. else 
32. echo '$var1 not eq $var2' 
33. fi 


see also

shell bash判断文件或文件夹是否存在

如何在shell中判断一个文件是否为空

shell判断文件是否为空