Warm tip: This article is reproduced from serverfault.com, please click

tcsh passing a variable inside a shell script

发布于 2020-11-30 11:02:19

I've defined a variable inside a shell script and I want to use it. For some reason, I cannot pass it into to command line that I need it in.

Here's my script which fails at the last lines

#! /usr//bin/tcsh -f
if ( $# != 2 ) then
        echo "Usage: jump_sorter.sh <jump> <field to sort on>"
        exit;
endif

set a = `cat $1 | tail -1` #prepares last row for check with loop 
set b = $2 #this is the value last row will be checked for

set counter = 0
foreach i ($a)

if ($i == "$b") then
    set bingo = $counter 
    echo "$bingo is the field to print from $a"
endif

set counter = `expr $counter + 1`
end

echo $bingo #this prints the correct value for using in the command below
cat $1 | awk '{print($bingo)}' | sort | uniq -c | sort -nr #but this doesn't work.

#when I use $9 instead of $bingo, it does work.

How can I pass $bingo into the final line correctly, please?

Update: following the accepted answer from Martin Tournoij, the correct way to handle the "$" sign in the command is:

cat $1 | awk "{print("\$"$bingo)}" | sort | uniq -c | sort -nr

Questioner
ZakS
Viewed
0
Martin Tournoij 2020-11-30 19:08:23

The reason it doesn't work is because variables are only substituted inside double quotes ("), not single quotes ('), and you're using single quotes:

cat $1 | awk '{print($bingo)}' | sort | uniq -c | sort -nr

The following should work:

cat $1 | awk "{print($bingo)}" | sort | uniq -c | sort -nr

You also have an error here:

#! /usr//bin/tcsh -f

That should be:

#!/usr/bin/tcsh -f 

Note that csh isn't usually recommended for scripting; it has many quirks and lacks some features like functions. Unless you really need to use csh, it's recommended to use a Bourne shell (/bin/sh, bash, zsh) or a scripting language (Python, Ruby, etc.) instead.