I have a script where I am passing commands to processes with an arguments passed from command line and from environment variables as well. To simplify my use case lets assume my processes are echo command. I noticed that variable expansion is more easy for numeric variables $1 passed from command line than for environment variables $VAR. For numeric variables I don't need to have white spaces around to make it work, see example below: f1() {   echo &quot;this is 1 $1 and var $VAR done&quot; } VAR=2 f1 1 #this is 1 1 and var 2 done f2() {   echo &quot;this_is_1_$1_and_var_$VAR_done&quot; } VAR=2 f2 1 #this_is_1_1_and_var_  As you can see, if I replace spaces with underlines, then named variable is no longer interpreted while numeric variable still works fine. I learned how to workaround this limitation by extra quoting f3() {   echo &quot;this_is_1_$1_and_var_&quot;&quot;$VAR&quot;'_done' } VAR=2 f3 1 #this_is_1_1_and_var_2_done  The problem is that my script requires quite a lot of substitution in long SQL statements. Putting extra quotes in each places will make it much more difficult to read and maintain. Therefore I would find it useful to mimic command line argument but it (obviously) doesn't work: 1=echo $VAR $1  Is there any trick I can make it work?
4564
I can write  VAR=$VAR1 VAR=${VAR1} VAR="$VAR1" VAR="${VAR1}"   the end result to me all seems about the same. Why should I write one or the other? are any of these not portable/POSIX?
35975
The variable BUILDNUMBER is set to value 230. I expect 230_ to be printed for the command echo $BUILDNUMBER_ but the output is empty as shown below.  # echo $BUILDNUMBER_  # echo $BUILDNUMBER 230
23266
I just saw this in an init script: echo $&quot;Stopping Apache&quot;  What is that dollar-sign for? My research so far: I found this in the bash manual:  extquote  If set, $'string' and $&quot;string&quot; quoting is performed within ${parameter} expansions enclosed in double quotes.  This option is enabled by default.   ...but I'm not finding any difference between strings with and without the $ prefix: $ echo &quot;I am in $PWD&quot; I am in /var/shared/home/southworth/qed $ echo $&quot;I am in $PWD&quot; I am in /var/shared/home/southworth/qed $ echo $&quot;I am in ${PWD}&quot; I am in /var/shared/home/southworth/qed $ echo &quot;I am in ${PWD}&quot; I am in /var/shared/home/southworth/qed $ echo 'I am in ${PWD}' I am in ${PWD} $ echo $'I am in ${PWD}' I am in ${PWD} $ echo $'I am in $PWD' I am in $PWD
36164
According to  and my own understanding, the tilde expands to the home directory:  $ echo ~ /home/braiam   Now, whenever I want the shell expansion to work, i. e. using variable names such $FOO, and do not break due unexpected characters, such spaces, etc. one should use double quotes ":  $ FOO="some string with spaces" $ BAR="echo $FOO" $ echo $BAR echo some string with spaces   Why doesn't this expansion works with the tilde?  $ echo ~/some/path /home/braiam/some/path $ echo "~/some/path" ~/some/path
84768
I'm used to type strings with quotation marks, but from now and then when I surf through config files and recommendations, I see apostrophes being used.  I often copy apostrophe things into my config files and substitute it with my quotation marks so that the code fits together.  But what is their difference? (I mostly target this for bash. If other Linux-based scripting does it different, that would be an extra.)  For example:  echo "Hello World!" and echo 'Hello World!'  Has it something to do that I maybe can't use (formatted) variables if I use one or the other, or is it simply personal preference?
18366
In bash one can escape arguments that contain whitespace.  foo "a string"   This also works for arguments to a command or function:  bar() {     foo "$@" }  bar "a string"   So far so good, but what if I want to manipulate the arguments before calling foo?  This does not work:  bar() {     for arg in "$@"     do         args="$args \"prefix $arg\""     done      # Everything looks good ...     echo $args      # ... but it isn't.     foo $args      # foo "$args" would just be silly }  bar a b c   So how do you build argument lists when the arguments contain whitespace?
104860
I am trying to delete two lines ( 7 and 8) from a .txt file. For this I am using following code:-  #!/bin/sh Column="7" sed '"$Column",8d' myfile.txt &gt; result.txt   on running this script, I am getting this error:-  sed: -e expression #1, char 1: unknown command: `"'   Please tell me how to use variable as a part of sed command.
25759
I have encountered comparisions of variables to string literals multiple times over the years which had one character prefixing the variable and the literal, e.g.  if [ "x$A" = "xtrue" ]; then   in order to check whether $A is "true".  I assume this is done to achieve shell compatibility or to work around a longterm bug, an unintuitive behavior, etc. Nothing obvious comes to mind.  Today I figured I want to know the reason, but my research didn't turn up anything. Or maybe it's just me making something out of a rather frequent exposure to rare occurances.  Is this practice still useful, maybe even best?
42231
One of my coworkers has provided me with a Bash syntax that I am unfamiliar with.  My Google foo has failed me on figuring out what it does and why/when I should use it.    The command that he sent me was of this form:  someVariable=something command   Initially, I thought that this was equivalent to the following:   someVariable=something ; command   Or  someVariable=something  command   But this doesn't appear to the be case.  Examples:   [Jan-03 11:26][~]$ # Look at the environment variable BAZ. It is currently empty [Jan-03 11:26][~]$ echo $BAZ  [Jan-03 11:27][~]$ # Try running a command of the same format     [Jan-03 11:27][~]$ BAZ=jake echo $BAZ  [Jan-03 11:27][~]$     [Jan-03 11:27][~]$ # Now, echo BAZ again. It is still empty:     [Jan-03 11:27][~]$ echo $BAZ  [Jan-03 11:27][~]$     [Jan-03 11:28][~]$     [Jan-03 11:28][~]$ # If we add a semi-colon to the command, we get dramatically different results: [Jan-03 11:28][~]$ BAZ=jake ; echo $BAZ jake [Jan-03 11:28][~]$ [Jan-03 11:28][~]$ # And we can see that the variable is actually set: [Jan-03 11:29][~]$ echo $BAZ jake [Jan-03 11:29][~]$   What does this syntax do?  What happens to the variable that has been set?  Why does this work?
91318
In the sequence of five commands below, all depend on single-quotes to hand off possible variable substitution to the called bash shell rather than the calling shell. The calling user is xx, but the called shell will be run as user yy. The first command substitutes $HOME with the calling shell's value because the called shell is not a login shell. The second command substitutes the value of $HOME loaded by a login shell, so it is the value belonging to user yy. The third command does not rely on a $HOME value and creates a file in the guessed home directory of user yy.  Why does the fourth command fail? The intention is that it writes the same file, but relying on the $HOME variable belonging to user yy to ensure it actually does end up in her home directory. I don't understand why a login shell breaks the behaviour of a here-doc command passed in as a static single-quoted string. The failure of the fifth command verifies that this problem is not about variable substitution.  xx@host ~ $ sudo -u yy bash -c 'echo HOME=$HOME' HOME=/home/xx xx@host ~ $ sudo -iu yy bash -c 'echo HOME=$HOME' HOME=/home/yy xx@host ~ $ sudo -u yy bash -c 'cat &gt; /home/yy/test.sh &lt;&lt; "EOF" &gt; script-content &gt; EOF &gt; ' xx@host ~ $ sudo -iu yy bash -c 'cat &gt; $HOME/test.sh &lt;&lt; "EOF" &gt; script-content &gt; EOF &gt; ' bash: warning: here-document at line 0 delimited by end-of-file (wanted `EOFscript-contentEOF') xx@host ~ $ sudo -iu yy bash -c 'cat &gt; /home/yy/test.sh &lt;&lt; "EOF" &gt; script-content &gt; EOF &gt; ' bash: warning: here-document at line 0 delimited by end-of-file (wanted `EOFscript-contentEOF')   These commands were issued on a Linux Mint 18.3 Cinnamon 64-bit system, which is based on Ubuntu 16.04 (Xenial Xerus).  Update: The here-doc aspect is just clouding the issue. Here's a simplification of the problem:  $ sudo bash -c 'echo 1 &gt; echo 2' 1 2 $ sudo -i bash -c 'echo 1 &gt; echo 2' 1echo 2   Why does the first of those two commands preserve the linebreak and the second does not? sudo is common to both commands, yet seems to be escaping/filtering/interpolating differently depending on nothing but the "-i" option.
60654
The question is about special variables. Documentation says:     !!:$      designates the last argument of the preceding command. This may   be shortened to !$.        ($_, an underscore.) At shell startup, set to the absolute pathname used  to invoke the shell or shell script being executed as passed in the    environment or argument list. Subsequently, expands to the last argument to the previous command after expansion. Also set to the full pathname  used to invoke each command executed and placed in the environment    exported to that command.    There must be some difference I cannot catch, because:  $ echo "hello" &gt; /tmp/a.txt $ echo "!$" echo "/tmp/a.txt" /tmp/a.txt  $ echo "hello" &gt; /tmp/a.txt $ echo $_ hello   What is the difference?
113862
Does anybody of a way to access files and directories that have a % in their name (which is valid) from the command-line? Specifically, if there are two %’s and the text between them happens to correspond to an environment variable.  For example, if there is a file called C:\blah\%temp%.txt or a folder called C:\Program Files\%temp%\, none of the following will work because the variable gets expanded:  &gt; dir "c:\blah\%temp%.txt" &gt; dir "c:\blah\^%temp^%.txt" &gt; dir "c:\blah\%%temp%%.txt" &gt; dir "c:\blah\\%temp\%.txt"  &gt; dir "c:\program files\%temp%" &gt; dir "c:\program files\^%temp^%" &gt; dir "c:\program files\%%temp%%" &gt; dir "c:\program files\\%temp\%"    Using wildcards will work, but does not uniquely select the file/folder and may include others:  &gt; dir "c:\blah\?temp?.txt"        (also shows ztempz.temp, 1tempa.txt, etc.) &gt; dir "c:\program files\?temp?"   (likewise)    (This is frustrating because every now and then—usually when Explorer is restarted for whatever reason—the environment variables stop expanding and some places where they are used end up creating files or directories with the environment variable in it. For example, because I configured Chromium to store its cache in a subdirectory of %temp%, if the variable expands, it is fine, but when it doesn’t, Chromium creates a directory called %temp% under its own directory and stores the cache—which can get large—there. I want to add a line to my temp-/junk-file cleaning script to automatically delete that folder if it exists, but I cannot figure out how to access it from the command-line without resorting to wildcards.)
76806
Below is some sort of pseudo-code for what I'm trying to accomplish:  #!/bin/bash  # I already have the variable below figured out (positive integer): numlines=$([returns number of lines containing specific characters in a file])  # This is basically what I want to do with it: for i in {1..$numlines}; do     # the part below is already figured out as well:             do some other stuff done   I can execute it fine from the command line by inserting the actual number in the `{1..n}' sequence.  I just need to know if it's possible to include a variable here and how to go about doing it.   I have tried exporting it I have tried putting the variable itself in curly braces inside the sequence: {1..${numlines}} I have tried putting it in double-quotes hoping it would expand: {1.."$numlines"} I have tried escaping the $: {1..\$numlines}   Do I need to use a set -[something] command in order for this variable to get expanded?  I have even tried some forms of using eval...all to no avail.  I just need to know if there is something simple or obscure that I am missing or if this is even possible before I waste anymore time on it.  I could throw together a really, really hackish way of doing it to make it work as needed, but I'd like to avoid that if at all possible and learn the right way to go about doing it.
70608
I have a variable for color. I use it to set color to strings, by evaluating it inside the string. However, I need to include space after the name(so that the name doesn't contain part of the text). This sometimes looks bad.  How can I avoid using(printing) this space?  Example(Let's say that Red=1 and NC=2):  echo -e "$Red Note: blabla$NC".   Output:  1 Note: blabla2.   Expected output:  1Note: blabla2.
119848
I am looking for a convenient way to add and/or modify and/or delete an environment variable from the command line. Particularly, I find myself at times in situations when I have to add a few variables in cmd.exe.  I'd be grateful if someone showed me a non-GUI way to modify (that is: to add a new directory to) the %PATH% variable.  The change should be be permanent, not just for duration of the cmd session.
23088
I'm confused with using single or double brackets. Look at this code:  dir="/home/mazimi/VirtualBox VMs"  if [[ -d ${dir} ]]; then     echo "yep" fi   It works perfectly although the string contains a space. But when I change it to single bracket:  dir="/home/mazimi/VirtualBox VMs"  if [ -d ${dir} ]; then     echo "yep" fi   It says:  ./script.sh: line 5: [: /home/mazimi/VirtualBox: binary operator expected   When I change it to:  dir="/home/mazimi/VirtualBox VMs"  if [ -d "${dir}" ]; then     echo "yep" fi   It works fine. Can someone explain what is happening? When should I assign double quotes around variables like "${var}" to prevent problems caused by spaces?
9050
I have a shell script with this code:  var=`hg st -R "$path"` if [ -n "$var" ]; then     echo $var fi   But the conditional code always executes, because hg st always prints at least one newline character.   Is there a simple way to strip whitespace from $var (like trim() in )?   or   Is there a standard way of dealing with this issue?   I could use  or , but I'd like to think there is a more elegant solution to this problem.