programación de alto nivel shell Bash - Operadores y temas relacionados

Operadores y temas relacionados

operadores

asignación

asignación de variable, o modificar el valor de una variable de inicialización

=

Asignación general de operador puede ser utilizado para la asignación de la aritmética y la cadena.

var=12
car=bmw # 在=号后面不能出现空白字符的

No se debe confundir =el operador de asignación y =los operadores de prueba

# = 在这里是测试操作符
if [ "$string1" = "$string2" ]
# if [ "X$string1" = "X$string2" ] 是一种更安全的做法,
# 这样可以防止两个变量中的一个为空所产生的错误.
# (字符"X"作为前缀在等式两边是可以相互抵消的.)
then
	command
fi

Los operadores aritméticos
+
cálculo Además

-
resta

*
multiplicación

/
cálculo división

**

exponenciación

 # 在Bash, 版本2.02, 中开始引入了"**" 幂运算符.
 
let "z=5**3"
echo "z = $z"
# z = 125

%

operación de módulo, o es el operador de módulo

Máximo común divisor

#!/bin/bash
# gcd.sh: 最大公约数
#使用Euclid的算法

# 两个整数的"最大公约数" (gcd),
#+ 就是两个整数所能够同时整除的最大的数.

# Euclid算法采用连续除法.
# 在每一次循环中,
#+ 被除数 <--- 除数
#+ 除数 <--- 余数
#+ 直到 余数 = 0.
#+ 在最后一次循环中, gcd = 被除数.
#
# 关于Euclid算法的更精彩的讨论, 可以到
#+ Jim Loy的站点, http://www.jimloy.com/number/euclids.htm.

# ------------------------------------------------------
# 参数检查
ARGS=2
E_BADARGS=65

if [ $# -ne "$ARGS" ]
then
 echo "Usage: `basename $0` first-number second-number"
 exit $E_BADARGS
fi
# ------------------------------------------------------

gcd ()
{
 dividend=$1
# 随意赋值.
 divisor=$2
#+ 在这里, 哪个值给的大都没关系.
# 为什么没关系?
 remainder=1
# 如果在循环中使用了未初始化的变量,
#+ 那么在第一次循环中,
#+ 它将会产生一个错误消息.
 until [ "$remainder" -eq 0 ]
 do
let "remainder = $dividend % $divisor"
dividend=$divisor
# 现在使用两个最小的数来重复.
divisor=$remainder
 done
# Euclid的算法
}
# Last $dividend is the gcd.
gcd $1 $2
echo; echo "GCD of $1 and $2 = $dividend"; echo
# Exercise :
# --------
# 检查传递进来的命令行参数来确保它们都是整数.
#+ 如果不是整数, 那就给出一个适当的错误消息并退出脚本.
exit 0

los resultados

andrew@andrew:/work/bash/src$ bash gcd.sh  2345 56

GCD of 2345 and 56 = 7

+=
"Plus - igual a" (el valor de la variable, un aumento constante y luego asignado al resultado variable) let "var += 5" varse añadirá valor de la variable sobre la base de la original 5.

-=

"Guardar - igual a" (el valor de la variable y luego restando una constante asignado el resultado)

*=
"Take - iguales" (primer valor variable se multiplica por un valor constante, y luego envía los resultados a una variable)
let "var *= 4" varvariable de resultado se multiplicará por 4 base de la original.

/=
"Además de - igual a" (valor obtenido dividiendo el valor de una primera variable constante, y luego asignado al resultado variable)

%=
"Modulo - igual a" (primer modo de variables de funcionamiento, es decir, de módulo dividido por una constante, y asignar el resultado a variable)
operadores aritméticos ocurren a menudo en expro letexpresión.

El uso de los operadores aritméticos

#!/bin/bash
# 使用10种不同的方法计数到11.
n=1; echo -n "$n "

let "n = $n + 1"
# let "n = n + 1" 也可以.
echo -n "$n "

: $((n = $n + 1))
# ":" 是必需的, 因为如果没有":"的话,
#+ Bash将会尝试把"$((n = $n + 1))"解释为一个命令.
echo -n "$n "

(( n = n + 1 ))
# 上边这句是一种更简单方法.
# 感谢, David Lombard, 指出这点.
echo -n "$n "

n=$(($n + 1))
echo -n "$n "

: $[ n = $n + 1 ]
# ":" 是必需的, 因为如果没有":"的话,
#+ Bash将会尝试把"$[ n = $n + 1 ]"解释为一个命令.
# 即使"n"被初始化为字符串, 这句也能够正常运行.
echo -n "$n "
 
n=$[ $n + 1 ]
# 即使"n"被初始化为字符串, 这句也能够正常运行.
#* 应该尽量避免使用这种类型的结构, 因为它已经被废弃了, 而且不具可移植性.
echo -n "$n "  # echo输出时不输出最后的回车
# 现在来一个C风格的增量操作.
 
let "n++"
# let "++n" 也可以.
echo -n "$n "

(( n++ ))
# (( ++n ) 也可以.
echo -n "$n "
 
: $(( n++ ))
# : $(( ++n )) 也可以.
echo -n "$n "

: $[ n++ ]
# : $[ ++n ]] 也可以.
echo -n "$n "
echo
exit 0

los resultados

andrew@andrew:/work/bash/src$ bash algroth.sh 
1 2 3 4 5 6 7 8 9 10 11 

variable entera de hecho golpe hay un símbolo de longitud (32-bit) número entero de valor en el intervalo indicado es -2147483648 2147483647. Si se supera este rango de operaciones aritméticas, entonces no va a obtener el resultado deseado.

bash no puede ser directamente el cálculo de coma flotante, si la necesidad de cálculos de punto flotante es necesario utilizar en la secuencia de comandos bc, este comando puede ser operaciones de punto flotante, o llamar a las funciones de la biblioteca de matemáticas

operador de bits

<<

una izquierda

<<=

"Izquierda - Asignación"
let "var <<= 2"
esta sentencia es el resultado de la variable vara la izquierda 2de posición (se multiplica por 4)

>>

correcta

>>=

Derecha - Asignación

&
AND bit a bit

&=
"Bit a bit y - asignación"

|
o bit a bit

|=
"Bit a bit o - Asignar"

~
Anti-bits

!

No poco

^
Bit a bit OR exclusiva XOR

^=
"XOR bit a bit - Asignación"

Los operadores lógicos

&&
Y (lógico)

if [ $condition1 ] && [ $condition2 ]
# 与 if [ $condition1 -a $condition2 ] 相同
# 如果condition1和condition2都为true, 那结果就为true.

if [[ $condition1 && $condition2 ]] #也可以
## 注意 && 符号不允许出现在[...]中

||
O (lógico)

if [ $condition1 ] || [ $condition2 ]
# 与 if [ $condition1 -o $condition2 ] 相同
# 如果condition1或condition2中的一个为true, 那么结果就为true.

if [[ $condition1 || $condition2 ]]
# 也可以.
# 注意||操作符是不能够出现在[ ... ]结构中的.

Uso && y || condición de prueba mixta

#!/bin/bash
 
a=24
b=47

# 如果a==24 并且b==47 则条件成立
if [ "$a" -eq 24 ] && [ "$b" -eq 47 ]
then
 echo "Test #1 succeeds."
else
 echo "Test #1 fails."
fi

# ERROR: 在单括号中不能使用 && 但是在双括号中能使用
if [ "$a" -eq 24 && "$b" -eq 47 ]
#+尝试运行' [ "$a" -eq 24 '
#+因为没找到匹配的']'所以失败了.
#
# 注意: if [[ $a -eq 24 && $b -eq 24 ]] 也能正常运行.
# 双中括号的if-test结构要比
#+ 单中括号的if-test结构更加灵活.
#(在第17行"&&"与第6行的"&&"具有不同的含义.)

if [ "$a" -eq 98 ] || [ "$b" -eq 47 ]
then
 echo "Test #2 succeeds."
else
 echo "Test #2 fails."
fi

# -a和-o选项提供了
#+ 一种可选的混合条件测试的方法.

if [ "$a" -eq 24 -a "$b" -eq 47 ]
then
 echo "Test #3 succeeds."
else
 echo "Test #3 fails."
fi

if [ "$a" -eq 98 -o "$b" -eq 47 ]
then
 echo "Test #4 succeeds."
else
 echo "Test #4 fails."
fi

a=rhino
b=crocodile
if [ "$a" = rhino ] && [ "$b" = crocodile ]
then
 echo "Test #5 succeeds."
else
 echo "Test #5 fails."
fi

exit 0

Utilice shellcheckla herramienta para probar la secuencia de comandos

andrew@andrew:/work/bash/src$ shellcheck if_else.sh 

In if_else.sh line 15:
if [ "$a" -eq 24 && "$b" -eq 47 ]
^-- SC1073: Couldn't parse this if expression.


In if_else.sh line 57:
exit 0
      ^-- SC1050: Expected 'then'.
      ^-- SC1072: Expected 'then'.. Fix any mentioned problems and try again.

problemas 15 Consejos línea de escritura, la línea 15 para ver la secuencia de comandos se encuentra

if [ "$a" -eq 24 && "$b" -eq 47 ]Script utilizado entre comillas simples&&

&&和||操作符也可以用在算术上下文中.

andrew@andrew:~$ echo $(( 1 && 2 )) $((3 && 0)) $((4 || 0)) $((0 || 0))
1 0 1 0

,

,Ningún operador operador, coma puede enlazar dos o más operaciones aritméticas, todas las operaciones se llevará a cabo, pero sólo devuelve el resultado final de la operación

let "t1 = ((5 + 3, 7 - 1, 15 - 4))"
echo "t1 = $t1"   # t1 = 11
let "t2 = ((a = 9, 15 / 3))" # 设置"a"并且计算"t2".
echo "t2 = $t2 a = $a"# t2 = 5 a = 9

Las constantes numéricas

shellGuión Por defecto, los números se tratan como decimal, a menos que este número con una etiqueta o un prefijo especial. Si los números que comienzan con 0, entonces es octal, si los números en 0xel principio, entonces es un número hexadecimal 如果数字中间嵌入了#, entonces se considera que ser BASE#NUMBERen forma de notación.

representación constantes numéricas

#!/bin/bash
# numbers.sh: 几种不同数制的数字表示法.

# 10进制: 默认情况
let "dec = 32"
echo "decimal number = $dec"
# 32
# 这没什么特别的.


# 8进制: 以'0'(零)开头
# 八进制的  32 刚好是 3*8 + 2 = 26
let "oct = 032"
echo "octal number = $oct"
# 26
# 表达式结果是用10进制表示的.
# ---------------------------

# 16进制: 以'0x'或者'0X'开头的数字
# 十六进制的 0x32就是60
let "hex = 0x32"
echo "hexadecimal number = $hex"
# 50
# 表达式结果是用10进制表示的.

# 其他进制: BASE#NUMBER
# BASE的范围在2到64之间.
# NUMBER的值必须使用BASE范围内的符号来表示, 具体看下边的示例.

# 二进制的
let "bin = 2#111100111001101"
echo "binary number = $bin"
# 31181

let "b32 = 32#77"
echo "base-32 number = $b32"
# 231

let "b64 = 64#@_"
echo "base-64 number = $b64"
# 4031
# 这个表示法只能工作于受限的ASCII字符范围(2 - 64).
# 10个数字 + 26个小写字母 + 26个大写字符 + @ + _


echo

echo $((36#zz)) $((2#10101010)) $((16#AF16)) $((53#1aA))

# 1295 170 44822 3375


# 重要的注意事项:
# ---------------
# 使用一个超出给定进制的数字的话,
#+ 将会引起一个错误.

let "bad_oct = 081"
# (部分的) 错误消息输出:
# bad_oct = 081: value too great for base (error token is "081")
#Octal numbers use only digits in the range 0 - 7.

exit 0
andrew@andrew:/work/bash/src$ 
andrew@andrew:/work/bash/src$ shellcheck numbers.sh 
andrew@andrew:/work/bash/src$ bash numbers.sh 
decimal number = 32
octal number = 26
hexadecimal number = 50
binary number = 31181
base-32 number = 231
base-64 number = 4031

1295 170 44822 3375
numbers.sh: 行 56: let: bad_oct = 081: 数值太大不可为算数进制的基 (错误符号是 "081")
Publicados 369 artículos originales · ganado elogios 148 · vistas 330 000 +

Supongo que te gusta

Origin blog.csdn.net/andrewgithub/article/details/104201885
Recomendado
Clasificación