На этот вопрос уже есть ответ здесь:
Довольно самоочевидно.
Первый аргумент должен быть:
Например:
+akiva@akiva-ThinkPad-X230:~$ ./myscript myfile.txt
/home/akiva/myfile.txt
Спасибо
Если Ваш сценарий
#!/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 запросил, чтобы специальные символы были распечатаны с Escape. Должен быть умный путь*, но я сделал это как это (хотя это не будет иметь дело с одинарными кавычками - но их нельзя оставить так или иначе),
[[ -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")"
Сценарий не необходим. Сингл 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
#!/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" ]]
: проверьте, существует ли переданный файл .