Ano*_*non 9 command-line bash paths
非常不言自明。
第一个参数应该是:
例如:
+akiva@akiva-ThinkPad-X230:~$ ./myscript myfile.txt
/home/akiva/myfile.txt
Run Code Online (Sandbox Code Playgroud)
谢谢
脚本不是必需的。一个readlink
命令就足够了:
$ cd /etc/
$ readlink -e passwd
/etc/passwd
Run Code Online (Sandbox Code Playgroud)
来自man readlink
:
-e, --canonicalize-existing
canonicalize by following every symlink in every component
of the given name recursively, all components must exist
Run Code Online (Sandbox Code Playgroud)
如果你的脚本是
#!/bin/bash
[[ -e "$1" ]] && readlink -f -- "$1"
Run Code Online (Sandbox Code Playgroud)
并且有执行权限( chmod u+x scriptname
) 就可以进入
./scriptname file
Run Code Online (Sandbox Code Playgroud)
如果文件存在,则获取完整路径(尽管 Serg 是正确的,如果我们使用该测试是多余的,readlink -e
而George 正确使用realpath
而不是readlink
)
[[ -e "$1" ]]
测试$1
脚本的第一个参数是否存在&&
如果是(如果前一个命令成功)然后执行下一个命令readlink -f -- "$1"
打印完整路径(到真实文件,即使$1
是符号链接)OP 要求使用转义符打印特殊字符。必须有一个聪明的方法*但我是这样做的(虽然它不会处理单引号 - 但无论如何都不能转义)
[[ -e "$1" ]] && readlink -f -- "$1" | sed -r 's/\||\[|\]| |!|"|\$|%|\^|&|\*|\(|\)\{|\}|\#|@|\;|\?|<|>/\\&/g'
Run Code Online (Sandbox Code Playgroud)
如果只是你担心的空间,你可以做到
sed 's/ /\\ /g'
Run Code Online (Sandbox Code Playgroud)
这将得到单引号(不是很有用)和空格
sed -r "s/'| /\\\&/g"
Run Code Online (Sandbox Code Playgroud)
但我认为你不能同时抓住单引号和双引号......
* 这是聪明的方法,100% 归功于steeldriver
[[ -e "$1" ]] && printf "%q\n" "$(readlink -f -- "$1")"
Run Code Online (Sandbox Code Playgroud)
#!/bin/bash
[[ -e "$1" ]] && echo realpath -e "$1"
Run Code Online (Sandbox Code Playgroud)
更新以处理非字母数字字符:
#!/bin/bash
[[ -e "$1" ]] && echo "$1" | sed -r 's/[^a-zA-Z0-9\-]/\//g' | realpath -e "$1"
Run Code Online (Sandbox Code Playgroud)
准备脚本:chmod +x script_name
,然后
用它 : ./script_name filename
信息:
[[ -e "$1" ]]
: 检查传递的文件是否存在。