pass wildcard to cut command in shell script and store it in a variable

纵然是瞬间 提交于 2019-12-20 05:23:18

问题


I am new to shell, I have a case where I am trying to evaluate a particular column unique values to check if they are valid in a shell script which will be invoked later.

From my searches I think cut along with sort & unique is good to do it

So my attempt is

file=/filepath/*vendor.csv
file_categories = `cut -d, -f1 $file |sort |unique`

$file should hold file which has vendor in its filename

but even after using command substitution (`) the $file is not getting replaced with the correct filename , it just places what is present in file

Another example for what I am attempting is

a=/stage/scripts/vendor/*.out
echo $a
/stage/Scripts/ecommerce/oneclick/nohup.out /stage/Scripts/ecommerce/Vendor/Vendor_Automate_Ingestion_Process.out

wc-l

wc: /stage/Scripts/ecommerce/vendor/*.out:

$(wc -l "$a")
wc: /stage/Scripts/ecommerce/vendor/*.out:No such file or directory

I want to understand how we can pass wild characters in command substitution and what I can do to rectify.


回答1:


No, file will contain the literal string with the wildcard. When you interpolate the value $file without quotes around it, that's when the shell evaluates it as a wildcard. echo "$file" with proper quoting shows you the actual value of the variable.

There is no good way to store a list of file names in a regular shell variable. Ksh and some other shells have arrays for this purpose, but it's not portable back to generic sh and may be something else than what you actually need, depending on what end goal you are trying to accomplish. If you want to extract unique values from a field in the files matching the wildcard into a string, just make sure you don't have spaces around the equals sign in the assignment and you're done.

file_categories=$(cut -d, -f1 $file | sort -u)
#              ^ no spaces around the equals sign!

Storing the wildcard in a variable is dubious here; probably simply use the wildcard directly if this is the problem you want to solve.

Everywhere you don't specifically want the shell to expand wildcards and tokenize a string, you need to put double quotes around it.

echo "$file_categories"

This string isn't properly machine readable, and so it's of limited use to capture it in a variable at all. I'll wager a small sum of money that you actually simply want to display the output directly instead of storing it in a variable so that you can then echo its value:

cut -d, -f1 /filepath/*vendor.csv | sort -u

If you want to loop over the values, pipe this further to while read -r ...




回答2:


In order to make your wc -l command to work, call it as such:

wc -l $a

Do not quote the a variable, the shell needs to expand it to read its * wildcard value



来源:https://stackoverflow.com/questions/48339963/pass-wildcard-to-cut-command-in-shell-script-and-store-it-in-a-variable

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!