我可以将本地文件的 bash 脚本输入 $1 并让它回显文件的绝对路径吗?

Ano*_*non 9 command-line bash paths

非常不言自明。

第一个参数应该是:

  • 检查文件是否存在
  • echo 该文件的绝对路径

例如:

+akiva@akiva-ThinkPad-X230:~$ ./myscript myfile.txt
/home/akiva/myfile.txt
Run Code Online (Sandbox Code Playgroud)

谢谢

Ser*_*nyy 8

脚本不是必需的。一个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)


Zan*_*nna 7

如果你的脚本是

#!/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 -eGeorge 正确使用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)

  • 也许以某种方式使用`printf '%q'` 是“聪明的方式”?例如`printf "%q\n" "$(readlink -f -- "$1")"` (2认同)

Geo*_*sen 7

#!/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

信息:

  1. [[ -e "$1" ]]: 检查传递的文件是否存在