I am very new to shell scripting and using CLI all together. However, I want to create a simple program that can collect arguments from a user.  Optimally, I want my shell script to get a network name and instance name from the user, and assign the values to variables.  I know that $# can be used to gather arguments, but are there any other ways? I often notice when I make a command, there is, for example, something like this: $create --instance_name NAME . Can I gather an argument by using -- to specify the parameter? If so, here is an example of the command:  $collect_variable.sh --network NETWORK_NAME --instance_name INSTANCE_ID  Once again, thank you for any help. I am very new to stack overflow and unix all together, and any help is appreciated.
1384
Say, I have a script that gets called with this line: ./myscript -vfd ./foo/bar/someFile -o /fizz/someOtherFile  or this one: ./myscript -v -f -d -o /fizz/someOtherFile ./foo/bar/someFile   What's the accepted way of parsing this such that in each case (or some combination of the two) $v, $f, and  $d will all be set to true and $outFile will be equal to /fizz/someOtherFile?
112122
Can anybody explain to me what the shell does in the two examples A) and B) below? It obviously behaves differently, but I can't find out why the output is different.  Example: Let's have a script in our current directory named bla.sh with only one command: echo ${0##/*} hello  A) Started as: ./bla.sh gives: ./bla.sh hello  B) Started as: . bla.sh gives: -bash hello  Since I use this in a script, the second output (because of the "-" in front of the -bash) kills the command. Of course, a simple -- before the ${...} helped, but I would love to understand what causes the output in the first place.I love bash. And vi[m]. But I digress…
83139
I wish to use shell to invoke a script on a remote server. I would like to capture the output of that script (its logging messages) and the exit code it returns.   If I do this:  ssh user@server /usr/local/scripts/test_ping.sh echo "$?"   I get the exit code but can't capture the remote logging messages .  If I do this:  local RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh) echo "$?"  LOG "${RESULTS}";   I get to log my output using my LOG function but can't seem to get a correct exit code, I assume the code I get is the code from the varianble assignment.   I would like to continue to use my LOG function to capture all output as it formats and sends things to a file, syslog, and the screen for me.   How can I capture results in a var AND get the correct exit code from the remote script?
99178
Consider I've set variable site and needs to be printed by echo or printf, but If I use single quote to write something and want to use variable then how?  Example:  $ site=unix.stackexchange.com $ echo "visit:$site" visit:unix.stackexchange.com   But If I use single quote:  $ echo 'visit:$site' visit:$site   Then we know that '' is strong quote and will not expand the variable   I've tried something:  $ echo 'visit:"$site"' visit:"$site"   but do not succeed. So, I am looking for way to print value inside variable while using single quote.
10724
Here is my script (to find the files that contain a specified pattern):  find . -type f \     -exec awk -v vawk="$1" '/'"$vawk"'/ {c++} c&gt;0 { print ARGV[1]; exit 0 } END { if (! c) {exit 1}}' \{\} \;   I would like to use my script with an argument §:  MyScript.sh pattern   My problem is that I don't manage to put the $1 variable in awk.  When I try to debug my script  bash -x MyScript.sh pattern   Here is the output :  + find . -type f -exec awk -v vawk=pattern '// {c++} c&gt;0 {print ARGV[1] ; exit 0 } END { if (! c) {exit 1}}' '{}' ';'   The $vawk variable seems to be empty.  Any idea?
115643
If I just use basename {} .txt, it will work:  find . -iname "*.txt" -exec basename {} .txt \;   It will just print xxx instead of ./xxx.txt  if I want use $(basename {} .txt) in the -exec option, it will fail:  find . -iname "*.txt" -exec echo "$(basename {} .txt)" \;   It will just print ./xxx.txt  How can I solve this problem? I hope I can use $(basename {} .txt) as parameters for other cmd. Do I have to do sh -c or pipe -exec basename {} \; with xargs?
59860
I'm trying to get quoted parameters of a bash script to safely be received by a nested script. Any ideas?  test.sh  #!/bin/bash echo $* bash myecho.sh $*   myecho.sh  #!/bin/bash  echo $1  echo $2  echo $3  echo $4   Sample:  bash test.sh aaa bbb '"ccc ddd"'   Result:  aaa bbb "ccc ddd" aaa bbb "ccc ddd"   Wanted result  aaa bbb "ccc ddd" aaa bbb ccc ddd
69962
I have an application which takes as an input attributes in double quotes embedded in single quotes. Take for example this right command:  command -p 'cluster="cl1"'   In order to automate it, I created a bash file using $CLUSTER as a variable. How should be my command? In other words, what should I put instead of cl1?  Please note that, If I modified the above command, it won't be accepted. For instance: command -p "cluster=cl1" is not accepted
26823
I've hacked on a lot of shell scripts, and sometimes the simplest things baffle me. Today I ran across a script that made extensive use of the : (colon) bash builtin.  The  seems simple enough:   : (a colon)        : [arguments]         Do nothing beyond expanding arguments and performing redirections. The return status is zero.    However I have previously only seen this used in demonstrations of shell expansion. The use case in the script I ran across made extensive use of this structure:  if [ -f ${file} ]; then     grep some_string ${file} &gt;&gt; otherfile || :     grep other_string ${file} &gt;&gt; otherfile || : fi   There were actually hundreds of greps, but they are just more of the same. No input/output redirects are present other than  the simple structure above. No return values are checked later in the script.  I am reading this as a useless construct that says "or do nothing". What purpose could ending these greps with "or do nothing" serve? In what case would this construct cause a different outcome than simply leaving off the || : from all instances?
48712
I am new to bash script programming.  I want to implement a bash script 'deploymLog', which accepts as input one string argument(name).  [root@localhost Desktop]# ./deploymLog.sh name   here I want to pass the string argument(name) through command line   As an initial step, I need to append the current timestamp along with this input string to a log file say Logone.txt in current directory in the below format:  [name]=[System time timestamp1]   How it is possible?
2410
I wish to have long and short forms of command line options invoked using my shell script.  I know that getopts can be used, but like in Perl, I have not been able to do the same with shell.  Any ideas on how this can be done, so that I can use options like:  ./shell.sh --copyfile abc.pl /tmp/ ./shell.sh -c abc.pl /tmp/   In the above, both the commands mean the same thing to my shell, but using getopts, I have not been able to implement these?
65652
In bash, I know that it is possible to write a for loop in which some loop control variable i iterates over specified integers.  For example, I can write a bash shell script that prints the integers between 1 and 10: #!/bin/bash  for i in {1..10} do  echo $i done  Is it possible to instead iterate over a loop control variable that is a string, if I provide a list of strings?  For example, suppose that I have a string fname that represents a file name.  I want to call a set of commands for each file name.  For example, I might want to print the contents of fname using a command like this: #!/bin/bash  for fname in {&quot;a.txt&quot;, &quot;b.txt&quot;, &quot;c.txt&quot;} do  echo $fname done  In other words, on the first iteration, fname should have the value fname=&quot;a.txt&quot;, while on the second iteration, fname should have the value fname=&quot;b.txt&quot;, and so on.  Unfortunately, it seems that the above syntax is not quite correct.  I would like to obtain the output:  a.txt b.txt c.txt  but when I try the above code, I obtain this output:  {a.txt, b.txt, c.txt}  Can you please help me determine the correct syntax, so that I can iteratively change the value/contents of the variable fname?  Thank you for your time.
61827
How can I setup an array variable in a DOS batch script?  I would like to load it with a list of file names to process.  I really would like to keep this as simple as possible.  Thank you.
108303
I'm working on a Perl script. How can I pass command line parameters to it?  Example:  script.pl "string1" "string2"
4896
How can I get the pid of a subshell?  For example:  $ echo $$ 16808   This doesn't work, because the original shell expands $$:  $ ( echo $$ ) 16808   Why does single quoting not work? After the original shell removes the single quote, does the subshell not expand $$ in itself?  $ ( echo '$$' ) $$   Why does eval not work either? Is eval run by the subshell?  Why does it give me the original shell's PID?  $ ( eval echo '$$' ) 16808   Thanks.
22243
I am having difficulty getting a for loop to take user input in the form of an argument to a function I created. #!/bin/bash number1=&quot;$1&quot;    #Assume user input 5 loops=&quot;$2&quot;      #Assume user input 5 if [[ ${number1} &amp;&amp; ${loops} =~ ^-?[0.00-9.99]+$ ]];then    for number2 in {1..${loops}}    do        Product=$(echo &quot;${number1} * ${number2}&quot; | bc -l)        echo &quot;${number1} * ${number2} = ${Product}&quot;        if test ${number2} -eq 7;then            { echo &quot;----------------------&quot;; echo &quot;${number2} is the best number.&quot;; echo &quot;----------------------&quot;; continue; }        elif test ${number2} -eq 11;then            { echo &quot;------------------------------&quot;; echo &quot;${number2} is pretty awesome as well.&quot;; echo &quot;------------------------------&quot;; continue; }            fi     done else    { echo &quot;Please try again with a valid numerical entry.&quot;; exit 1; } fi  This script does not run when the user inputs an integer for the variable &quot;loops&quot;, and any number for &quot;number1&quot;. number1 = 5 in this case. It returns the error:  (standard_in) 1: syntax error 5 * {1..5} = /home/$USER/For_Loop_Multiplication.sh: line 9: test: {1..5}: integer expression expected /home/$USER/For_Loop_Multiplication.sh: line 11: test: {1..5}: integer expression expected  If I instead directly input an end bound on the number of loops directly into the script like the following, and number1 = 5, it runs fine: #!/bin/bash number1=&quot;$1&quot;     #Assume user input 5 if [[ ${number1} =~ ^-?[0.00-9.99]+$ ]];then    for number2 in {1..5}    do        Product=$(echo &quot;${number1} * ${number2}&quot; | bc -l)        echo &quot;${number1} * ${number2} = ${Product}&quot;        if test ${number2} -eq 7;then            { echo &quot;----------------------&quot;; echo &quot;${number2} is the best number.&quot;; echo &quot;----------------------&quot;; continue; }        elif test ${number2} -eq 11;then            { echo &quot;------------------------------&quot;; echo &quot;${number2} is pretty awesome as well.&quot;; echo &quot;------------------------------&quot;; continue; }            fi     done else    { echo &quot;Please try again with a valid numerical entry.&quot;; exit 1; } fi  It returns the result:  5 * 1 = 5 5 * 2 = 10 5 * 3 = 15 5 * 4 = 20 5 * 5 = 25  Essentially what I think is happening is that the script seems to be placing the entire range as the value number2, which is defined as the iterator in the for loop. Since the input for the variable &quot;loops&quot; is an integer, there should be no difference between asking the user for a range and placing it in the loop, or simply setting it as a default when I write the script. However, there apparently is a difference... Any insight into solving this problem is appreciated. Thanks.
7695
I need to copy /root/nbu/file1.sh to every user's home directory if user's id is even number.  Trying to execute following script:  #!/bin/bash cat /etc/passwd | while read LINE do     username=$(awk -v var="$LINE" -F: '{         if ($3 % 2 == 0)            print $1         }')     cp /root/nbu/file1.sh ~"$username" done   And it does nothing. If I echo cp /root/nbu/file1.sh ~"$username" command and execute it directly in the script, it works.  I guess the problem is that ~ gets expanded in the bash script, but can't figure out how to solve this problem.  Thank you in advance.