bash: попытка поместить вывод "find" в переменную с помощью "$()", но это не работает

Извините, но я соглашусь с @choroba и посоветую вам использовать инструмент, способный парсить и писать yaml. Разбор Sed - неправильный путь. у вас может быть другой отступ, несколько непрерывных концовок. Регулярное выражение стало бы слишком сложным, и вам пришлось бы писать свой собственный синтаксический анализатор Yaml.

Вот решение на рубине Что вы можете использовать в оболочке Bash

echo "ssl:
enabled: false
" | bundle exec ruby -e "require 'psych';
 c = Psych.load(STDIN.read); c['ssl']['enabled'] = true;
 puts c.to_yaml" > updated_dest.yml

если вам нужен сценарий оболочки, который принимает два параметра, это также легко

#!/usr/bin/env ruby

require 'psych'
c = Psych.load_file(ARGV.shift)
c['ssl']['enabled'] = true
File.open(ARGV.shift, 'wb+') {|f| f.write(c.to_yaml)}
-1
21.02.2020, 11:44
4 ответа

Строка ошибки 3 :отсутствует $перед rootPath.

0
28.04.2021, 23:22

Во-первых, в команде поиска отсутствует знак $. И чтобы получить только самую глубокую директорию, которую вы можете использовать, найдите вот так:

restOfPath=$(find $rootPath/$1 -type d -links 2)

Вы также можете попробовать этот способ (, что немного странно, но сработает):

restOfPath=$(find $rootPath/$1 -type d |awk '{lnew=gsub(/\//,"/",$0); if (lnew > l) {l=lnew p=$0}; } END {print p}')
0
28.04.2021, 23:22

Результат применения к вашему сценарию исправлений, предложенных shellcheck.net .

rootPath="/share/data/"
anchorDir="${1}"
restOfPath=$(find /rootPath/"$1"/ -type d)
#fullPath=rootPath+anchorDir+restOfPath
echo "rest of path is $restOfPath"

Перед применением изменений были обнаружены следующие проблемы


Line 3:
rootPath="/share/data/"
^-- SC2034: rootPath appears unused. Verify use (or export if used externally).

Line 4:
anchorDir="${1}"
^-- SC2034: anchorDir appears unused. Verify use (or export if used externally).

Line 5:
restOfPath=$(find /rootPath/$1/ -type d)
^-- SC2034: restOfPath appears unused. Verify use (or export if used externally).
                            ^-- SC2086: Double quote to prevent globbing and word splitting.

Did you mean: (apply this, apply all SC2086)
restOfPath=$(find /rootPath/"$1"/ -type d)

Line 7:
echo "rest of path is $restofPath"
                      ^-- SC2154: restofPath is referenced but not assigned (did you mean 'restOfPath'?).
0
28.04.2021, 23:22

Попробуйте это,

find /rootPath/$1/  -type d -printf '/%P\n'
/
/client
/client/region
/client/region/logs
/client/region/logs/2019

если нам нужна только последняя строка,

find /rootPath/$1/  -type d -printf '/%P\n' | tail -n1
/client/region/logs/2019

%P File's name with the name of the starting-point under which it was found removed.

0
28.04.2021, 23:22

Теги

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