我可以将本地文件输入到 bash 脚本中并让其回显该文件的绝对路径吗?

我可以将本地文件输入到 bash 脚本中并让其回显该文件的绝对路径吗?

很容易理解。

第一个参数应该是:

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

例如:

+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

信息:

  1. [[ -e "$1" ]]:检查是否通过文件已存在

相关内容