Как динамически установить имя переменной в сценарии оболочки?

С помощьюstar(изschily-tools)вы можете извлечь его с помощью:

star xf file.tgz -no-p -find -type d -chmod a+x

Чтобы добавить разрешение на выполнение (для всех )в извлеченные каталоги, чтобы исправить эти фиктивные разрешения в архиве.

С -no-pumaskтакже применяется, даже если он запущен от имени пользователя root, что, предполагая, что ваш umaskравен как минимум 002, также исправит эти слишком широкие разрешения на запись (обратите внимание, что umaskимеет приоритет над-chmod).

Обратите внимание, что ни одна из GNU tar, bsdtarили starреализации tarв моем тесте не имеет проблем с извлечением архива с такими нарушенными разрешениями. Скорее всего, вы пытаетесь извлечь его, когда уже существует каталог distбез разрешения на поиск (, потому что, например, вы распаковали аналогичный архив с аналогичными нарушенными разрешениями ).

Прежде чем распаковывать архив, вам нужно исправить эти разрешения.

2
01.08.2020, 23:18
2 ответа

Сценарий, эквивалентный shтому, что представлено в вопросе:

#!/bin/sh

exe1='filepath'
n=1
var=exe$n
eval "echo \"\$$var\""   # or: eval 'echo "$'"$var"'"'

Строка evalбудет оценивать данную строку как команду в текущей среде. Данной строкой является echo \"\$$var\", которая после расширения переменных и т. д. станет echo "$exe1". Это передается в evalдля повторной -оценки, и команда печатает строку filepath.


Вы также упоминаете массивы. Это правда, что оболочка POSIX shне имеет именованных массивов в том же смысле, что, например. bashесть, но у него все еще есть список позиционных параметров.

С его помощью вы можете делать большинство вещей, которые вам нужно делать со списком в оболочке.

Например,

set -- 'filepath1' 'filepath2' 'filepath3'

for name in "$@"; do    # or: for name do
    echo "$name"
done

что то же самое, что просто

for name in 'filepath1' 'filepath2' 'filepath3'
do
    echo "$name"
done

Поскольку я уверен в том, чего вы пытаетесь достичь, я не могу придумать более интересный пример. Но здесь у вас есть структура, подобная массиву -, которую вы повторяете. Почему вы хотите перебирать имена переменных, до сих пор не ясно.

6
28.04.2021, 23:26

Если вы хотите перебрать несколько файлов (, подразумеваемых из exe1=filepathв примере ), работает ли простой цикл for?

final_file— это переменная, содержащая последний файл, который соответствует файлу _шаблону -, реплицирующему последний аргумент bash ${!var}(, ссылающийся на ).

  #/bin/sh
  final_file=''
  file_pattern='*.txt'
  for f in $file_pattern
  do
      echo $f
      final_file=$f
  done
  echo $final_file
-1
28.04.2021, 23:26

Теги

Похожие вопросы