Я хочу, чтобы мой скрипт буквально отображал "$ 1" в файл - PullRequest
0 голосов
/ 12 июня 2019

Это часть моего сценария

#!/bin/bash

echo "ls /SomeFolder | grep $1 | xargs cat | grep something | grep  .txt | awk '{print $2}' | sed 's/;$//';" >> script2.sh

Это хорошо отражается на моем сценарии, кроме 1 и 2 долларов. Вместо этого он выводит ввод этих переменных, но я хочу, чтобы он буквально читал «$ 1» и «$ 2». Помощь

Ответы [ 2 ]

3 голосов
/ 12 июня 2019

Escape it:

echo "ls /SomeFolder | grep \$1 | xargs cat | grep something | grep  .txt | awk '{print \$2}' | sed 's/;\$//';" >> script2.sh

Цитируйте это:

echo "ls /SomeFolder | grep "'$'"1 | xargs cat | grep something | grep  .txt | awk '{print "'$'"2}' | sed 's/;"'$'"//';" >> script2.sh

или как это:

echo 'ls /SomeFolder | grep $1 | xargs cat | grep something | grep  .txt | awk '\''{print $2}'\'' | sed '\''s/;$//'\'';' >> script2.sh

Используйте указанный здесь документ :

cat << 'EOF' >> script2.sh
ls /SomeFolder | grep $1 | xargs cat | grep something | grep  .txt | awk '{print $2}' | sed 's/;$//';
EOF

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

0 голосов
/ 12 июня 2019

Во-первых, вы никогда не напишите это (см. https://mywiki.wooledge.org/ParsingLs, http://porkmail.org/era/unix/award.html и вам не нужны greps + seds + pipe при использовании awk):

ls /SomeFolder | grep $1 | xargs cat | grep something | grep  .txt | awk '{print $2}' | sed 's/;$//'`

вы бы написали это вместо:

find /SomeFolder -mindepth 1 -maxdepth 1 -type f -name "*$1*" -exec \
    awk '/something/ && /.txt/{sub(/;$/,"",$2); print $2}' {} +

или если вы предпочитаете использовать print | xargs вместо -exec:

find /SomeFolder -mindepth 1 -maxdepth 1 -type f -name "*$1*" -print0 |
    xargs -0 awk '/something/ && /.txt/{sub(/;$/,"",$2); print $2}'

и теперь добавить этот скрипт в файл будет:

cat <<'EOF' >> script2.sh
find /SomeFolder -mindepth 1 -maxdepth 1 -type f -name "*$1*" -print0 |
    xargs -0 awk '/something/ && /.txt/{sub(/;$/,"",$2); print $2}'
EOF

Кстати, если вы хотите, чтобы . в .txt трактовался буквально, а не как мета-выражение regexp, означающее «любой символ», тогда вы должны использовать \.txt вместо .txt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...