简体   繁体   中英

I want my script to echo “$1” into a file literally

This is part of my script

#!/bin/bash

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

This echos everything nicely into my script except $1 and $2. Instead of that it outputs the input of those variables but i want it to literally read "$1" and "$2". Help?

Escape it:

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

Quote it:

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

or like this:

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

Use quoted here document :

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

Basically you want to prevent expansion, ie. take the string literaly. You may want to read bashfaq quotes

First, you'd never write this (see https://mywiki.wooledge.org/ParsingLs , http://porkmail.org/era/unix/award.html and you don't need greps+seds+pipes when you're using awk):

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

you'd write this instead:

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

or if you prefer using print | xargs print | xargs instead of -exec :

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

and now to append that script to a file would be:

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

Btw, if you want the . in .txt to be treated literally instead of as a regexp metachar meaning "any character" then you should be using \\.txt instead of .txt .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM