Home >System Tutorial >LINUX >How to distinguish between $() and ${} and $(()) and (()) in bash shell
In the bash shell, $( ) and ` ` (backticks) are used for command substitution. And $() can be used in every shell. If you use bash2, there will be no problem...
Look at ${ }... It is actually used for variable substitution. In general, there is no difference between $var and ${var}. But using ${ } will more accurately define the scope of the variable name.
Here I will use some examples to illustrate some of the special functions of ${ }:
Suppose we define a variable as:
file=/dir1/dir2/dir3/my.file.txt
We can use ${ } to replace each other to obtain different values:
${file#*/}: Remove the first / and the string to the left: dir1/dir2/dir3/my.file.txt
${file##*/}: Remove the last / and the string to the left: my.file.txt
${file#*.}: Remove the first . and the string to the left: file.txt
${file##*.}: Remove the last . and the string to the left: txt
${file%/*}: Remove the last / and the string to the right: /dir1/dir2/dir3
${file%%/*}: Remove the first / and the string to the right: (null value)
${file%.*}: Remove the last . and the string to the right: /dir1/dir2/dir3/my.file
${file%%.*}: Remove the first . and the string to the right: /dir1/dir2/dir3/my
# is to remove the left side (# is to the left of $ on the appraisal plate)
% means removing the right side (% is to the right of $ on the disk)
A single symbol is the minimum match; two symbols is the maximum match.
${file:0:5}: Extract the leftmost 5 bytes: /dir1
${file:5:5}: Extract 5 consecutive bytes to the right of the 5th byte: /dir2
We can also replace the string in the variable value:
${file/dir/path}: Replace the first dir with path:/
path1/dir2/dir3/my.file.txt
${file//dir/path}: Replace all dirs with path:/
path1/path2/path3/my.file.txt
Using ${ } can also assign values to different variable states (unset, null value, non-null value):
${file-my.file.txt}: If $file is not set, use my.file.txt as the return value. (Null and non-null values will not be processed)
${file:-my.file.txt}: If $file is not set or is empty, use my.file.txt as the return value. (Non-null values will not be processed)
${file my.file.txt}: If $file is set to a null value or a non-null value, my.file.txt will be used as the return value. (No processing will be performed if not set)
${file: my.file.txt}: If $file is a non-empty value, use my.file.txt as the return value. (No processing will be performed if there is no setting or empty value)
${file=my.file.txt}: If $file is not set, use my.file.txt as the return value, and assign $file to my.file.txt. (Null and non-null values will not be processed)
${file:=my.file.txt}: If $file is not set or is empty, use my.file.txt as the return value, and assign $file to my.file.txt. (Non-null values will not be processed)
${file?my.file.txt}: If $file is not set, output my.file.txt to STDERR. (Null and non-null values will not be processed)
${file:?my.file.txt}: If $file is not set or is empty, output my.file.txt to STDERR. (Non-null values will not be processed)
The above understanding is that you must clearly distinguish the three assignment states of unset, null and non-null.
Generally speaking, : is related to null. If it does not contain :, null will not be affected. If it contains :, even null will be affected.
Also, ${#var} can calculate the length of the variable value:
${#file} can get 27 because /dir1/dir2/dir3/my.file.txt is exactly 27 bytes...
It is used for integer operations.
In bash, the integer arithmetic symbols of $(( )) are roughly as follows:
- * /: "Addition, subtraction, multiplication, division" respectively.
%: Remainder operation
& | ^ !: "AND, OR, XOR, NOT" operations respectively.
Example:
wangnc>a=5;b=7;c=2;
wangnc>echo $a $b
5 7
wangnc>echo $(( a b*c))
19
wangnc>echo $(((a*b)/c))
17
wangnc>echo $(($a $b*$c))
19
wangnc>
The variable name in $(( )) can be replaced by adding a $ symbol in front of it, or without it, such as:
$(( $a $b * $c)) can also get the result of 19
In addition, $(( )) can also perform operations with different carry numbers (such as binary, octal, and hexadecimal). However, the output results are all decimal:
echo $((16#2a)) The result is 42 (hexadecimal to decimal)
(())the use of:
In fact, simply using (( )) can also redefine variable values, or do testing:
a=5; ((a )) $a can be redefined as 6
a=5; ((a--)) then a=4
a=5; b=7; ((a < b)) will return 0 (true).
Common test symbols used for (( )) are as follows:
<: less than >: greater than
<=: less than or equal to >=: greater than or equal to
==: equal to
!=: Not equal to
The above is the detailed content of How to distinguish between $() and ${} and $(()) and (()) in bash shell. For more information, please follow other related articles on the PHP Chinese website!