Bash: имя каталога, из которого файл был «открыт как» - PullRequest
0 голосов
/ 16 сентября 2011

Как я могу поместить каталог (не полный путь) файла, открывшего скрипт, в переменную?Я предполагаю, что это то же самое, что и $ 1, поэтому я хотел бы, чтобы путь к файлу приводил к тому же результату при выполнении из терминала.

Объяснено;

#!/bin/bash
script.sh '~/foo/bar/file.ext'

#I want to put "bar" into a variable.

Он также должен работать, когда "файл".ext открывается через «script.sh» через GUI.

Ответы [ 3 ]

4 голосов
/ 16 сентября 2011

Вы должны извлечь обе программы: dirname и basename . Программа dirname принимает аргумент и удаляет имя программы из оставшейся части пути. То есть он даст вам имя каталога.

Программа basename делает обратное. Учитывая имя пути, он удалит все каталоги и просто оставит имя файла:

$ dirname /one/two/three/four/five.txt
/one/two/three/four
$ basename /one/two/three/four/five.txt
five.txt

Теперь все остальное зависит от раковины. В BASH (который является оболочкой по умолчанию в Linux и что вы пометили, вы можете использовать синтаксис $ (command). Он принимает выходные данные команды и заменяет их в командной строке. Например:

$ mydirectory=$(dirname /one/two/three/four/five.txt)
$ echo $mydirectory
/one/two/three/four

В приведенном выше примере команда dirname взяла имя каталога, заменила все в синтаксисе $() и позволила мне установить имя моей переменной mydirectory.

Вы можете использовать их в комбинации, чтобы получить то, что вы хотите:

$ my_full_dir=$(dirname "~/foo/bar/file.ext")
$ echo $my_full_dir
~/foo/bar
$ my sub_dir=$(basename $my_full_dir)
$ echo $sub_dir
bar

Вы также можете объединить команды basename и dirname вместе:

$ my_sub_dir=$(basename $(dirname "~/foo/bar/file.ext"))
$ echo $my_sub_dir
$ bar

Когда исполняется программа оболочки, она помещает каждый параметр в командной строке в переменную count. Например:

$ myprog alpha beta gamma delta

Внутри программы myprog установлены следующие переменные:

$1 = "alpha"
$2 = "beta"
$3 = "gamma"
$4 = "delta"

Еще одна вещь с оболочкой BASH: есть специальный синтаксис фильтра для анализа переменных.

  • ${variable#pattern} - Левый маленький рисунок. Удаляет наименьший рисунок с левой стороны переменной
  • ${variable##pattern} - Левый большой рисунок. Удаляет самый большой рисунок с левой стороны переменной
  • ${variable%pattern} - правый маленький рисунок. Удаляет наименьший рисунок с правой стороны переменной
  • ${variable%%pattern} - правый большой рисунок. Удаляет максимально возможный шаблон с правой стороны переменной

Вот пример:

$ FOO="ONE|TWO|THREE|FOUR"
$ echo ${FOO##*|}
FOUR
$ echo ${FOO#*|}
TWO|THREE|FOUR

В вышеприведенных случаях шаблон был *|. Это означает любую комбинацию букв, за которой следует |. В первом наименьшее совпадение было ONE|. Во втором это было ONE|TWO|THREE|. Вы также можете использовать это для имитации команд basename и dirname:

$ myfile="~/foo/bar/file.ext"
$ echo ${myfile%/*}     #Like `dirname`
~/foo/bar
$echo ${myfile#*/}      #Like `basename`
file.txt
0 голосов
/ 16 сентября 2011

Предполагая, что ваша оболочка /bin/bash:

echo $(basename $(dirname $1))
0 голосов
/ 16 сентября 2011

Добавьте какой-нибудь код к вашему script.sh

 echo '$1='"$1"

 inputFile=$1

 inputPath=${inputFile%/*}
 finalDir=${inputPath##*/}

 echo '$inputFile='"${inputFile}"
 echo '$inputPath='"${inputPath}"
 echo '$finalDir='"${finalDir}"

выводу

  ...
  $finalDir=bar

Это дает вам нужные результаты?

Надеюсь, это поможет.

...