![我可以将本地文件输入到 bash 脚本中并让其回显该文件的绝对路径吗?](https://linux22.com/image/998708/%E6%88%91%E5%8F%AF%E4%BB%A5%E5%B0%86%E6%9C%AC%E5%9C%B0%E6%96%87%E4%BB%B6%E8%BE%93%E5%85%A5%E5%88%B0%20bash%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E5%B9%B6%E8%AE%A9%E5%85%B6%E5%9B%9E%E6%98%BE%E8%AF%A5%E6%96%87%E4%BB%B6%E7%9A%84%E7%BB%9D%E5%AF%B9%E8%B7%AF%E5%BE%84%E5%90%97%EF%BC%9F.png)
很容易理解。
第一个参数应该是:
- 检查文件是否存在
- 回显该文件的绝对路径
例如:
+akiva@akiva-ThinkPad-X230:~$ ./myscript myfile.txt
/home/akiva/myfile.txt
谢谢
答案1
不需要脚本。一个readlink
命令就足够了:
$ cd /etc/
$ readlink -e passwd
/etc/passwd
来自man readlink
:
-e, --canonicalize-existing
canonicalize by following every symlink in every component
of the given name recursively, all components must exist
答案2
如果你的脚本是
#!/bin/bash
[[ -e "$1" ]] && readlink -f -- "$1"
并具有执行权限(chmod u+x scriptname
)您可以输入
./scriptname file
如果文件存在,则获取完整路径(尽管 塞尔吉是对的如果我们使用readlink -e
并且乔治是对的使用realpath
而不是readlink
)
笔记
[[ -e "$1" ]]
测试$1
脚本的第一个参数是否存在&&
如果是(如果前一个命令成功),则执行下一个命令readlink -f -- "$1"
打印完整路径(真实文件的完整路径,即使$1
是符号链接)
OP 要求打印特殊字符时使用转义符。一定有更聪明的方法*,但我这样做了(虽然它不会处理单引号 - 但无论如何单引号都无法转义)
[[ -e "$1" ]] && readlink -f -- "$1" | sed -r 's/\||\[|\]| |!|"|\$|%|\^|&|\*|\(|\)\{|\}|\#|@|\;|\?|<|>/\\&/g'
如果你只担心空间问题,那么你可以这样做
sed 's/ /\\ /g'
这将得到单引号(不是很有用)和空格
sed -r "s/'| /\\\&/g"
但我不认为你可以同时捕捉单引号和双引号......
* 这是聪明的方法,100%归功于钢铁司机
[[ -e "$1" ]] && printf "%q\n" "$(readlink -f -- "$1")"
答案3
#!/bin/bash
[[ -e "$1" ]] && echo realpath -e "$1"
更新以处理非字母数字字符:
#!/bin/bash
[[ -e "$1" ]] && echo "$1" | sed -r 's/[^a-zA-Z0-9\-]/\//g' | realpath -e "$1"
准备脚本:chmod +x script_name
,然后
用它 :./script_name filename
信息:
[[ -e "$1" ]]
:检查是否通过文件已存在。