Anon Asked: 2017-03-15 09:01:19 +0800 CST2017-03-15 09:01:19 +0800 CST 2017-03-15 09:01:19 +0800 CST 我可以将 bash 脚本将本地文件输入 $1 并让它回显文件的绝对路径吗?[复制] 772 很不言自明。 第一个论点应该是: 检查文件是否存在 回显该文件的绝对路径 例如: +akiva@akiva-ThinkPad-X230:~$ ./myscript myfile.txt /home/akiva/myfile.txt 谢谢 command-line 3 个回答 Voted Sergiy Kolodyazhnyy 2017-03-15T09:11:12+08:002017-03-15T09:11:12+08:00 脚本不是必需的。一个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 Best Answer Zanna 2017-03-15T09:12:43+08:002017-03-15T09:12:43+08:00 如果你的脚本是 #!/bin/bash [[ -e "$1" ]] && readlink -f -- "$1" 并且有执行权限(chmod u+x scriptname)可以进入 ./scriptname file 如果文件存在,则获取完整路径(尽管 Serg 是正确的,如果我们使用测试是多余的,readlink -e并且George 是正确的使用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% 归功于Steeldriver [[ -e "$1" ]] && printf "%q\n" "$(readlink -f -- "$1")" George Udosen 2017-03-15T09:20:19+08:002017-03-15T09:20:19+08:00 #!/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" ]]: 检查传递的文件是否存在。
脚本不是必需的。一个
readlink
命令就足够了:来自
man readlink
:如果你的脚本是
并且有执行权限(
chmod u+x scriptname
)可以进入如果文件存在,则获取完整路径(尽管 Serg 是正确的,如果我们使用测试是多余的,
readlink -e
并且George 是正确的使用realpath
而不是readlink
)笔记
[[ -e "$1" ]]
测试$1
脚本的第一个参数是否存在&&
如果是(如果上一个命令成功)然后执行下一个命令readlink -f -- "$1"
打印完整路径(到真实文件,即使$1
是符号链接)OP 要求使用转义符打印特殊字符。必须有一个聪明的方法*,但我是这样做的(虽然它不会处理单引号 - 但无论如何不能转义)
如果它只是你担心的空间,你可以做到这一点
这将得到单引号(不是很有用)和空格
但我认为你不能同时抓住单引号和双引号......
* 这是聪明的方法,100% 归功于Steeldriver
更新以处理非字母数字字符:
准备脚本:
chmod +x script_name
,然后用它 :
./script_name filename
信息:
[[ -e "$1" ]]
: 检查传递的文件是否存在。