0

I am reading from an input file that contains few hexadecimal numbers from a bash script. Then, I want to pass those strings as command line argument of an executable file.

Say, here is my test.txt:

278dca53f96014be
6c39b2d481e75f0a
38e5942f6bd0c71a

I am reading it through the script:

i=0
while read line || [ "$line" ]; do
    arr[$i]="$line"
    i=$((i+1))
done < test.txt

max=2
for n in `seq 0 $max`
do
s=${arr[$n]}
./main -o $s
done

As you can see, the numbers are passed as command line option for ./main.

Now, the problem is, I need to keep $s within double quotes. I tried this:

$t='"'
$s=$t$s$t

but it did not work.

Any idea on how to make it work?

  • 1
    Are you sure you don't just need to double quote $s as you should always do with variables? – Jesse_b Mar 30 '18 at 17:19
  • Just use "$s"? Or du you actually need the double quotes to be part of the argument? – Kusalananda Mar 30 '18 at 17:20
  • ...and s="${arr[$n]}". Or omit the $s entirely and do ./main -o "${arr[$n]}" – Patrick Mar 30 '18 at 17:21
  • Adding double quotes around $s did not work. – pushpen.paul Mar 30 '18 at 17:25
  • "Does not work" is not a valid bug report. – Kusalananda Mar 30 '18 at 17:26
2

From comments, it sounds as if your test.txt file comes from a Windows system and is a DOS text file. You should convert it to a Unix text file with dos2unix. Alternatively, modify the below to use tr -d '\r' <test.txt | head -n 3 in place of just head -n 3 test.txt.


You have a file with lines of text, and you need to invoke the script/program main once each for the three first of these lines:

head -n 3 test.txt | xargs -n 1 main -o

If you really need the double quotes to be part of the argument (this is unusual):

head -n 3 test.txt | xargs -I XX main -o '"XX"'

To invoke main once for each line in the file, use

xargs -n 1 main -o <test.txt
1

Using GNU sed's evaluate command:

sed 's#^#./main -o &#e' test.txt

And if the formatting is wrong, just precede that with some code. For example, if the format for the first line should be "./main -o 27 8d ca 53 f9 60 14 be", this would work:

sed 's/../& /g;s#^#./main -o &#e' test.txt

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.