1. Tipos e precauções de scripts de shell
Tipo: cat /etc/shells
bin/bash=======>Linux usa
bin/sh
bin/csh
bin/ksh por padrão
Nota: É diferente de C e retorna 0 para sucesso e 1 para falha.
Bom hábito gramatical: ao buscar o valor de uma variável, geralmente adicione "VAR"
2. Execute o método de script
1.chmod a+x shell.sh ./shell.sh
2./bin/bash shell.sh
3. . shell.sh
3. Instruções e Sintaxe
A. Variáveis
VAR=hello --variável local (variável local) echo $VAR env | grep &VAR não tem efeito
exportar VAR está definido como variável de ambiente (variável global) echo $VAR || env | grep &VAR tem efeito
alias === renomear o comando
B. Substituição de Comando
Backticks ====== Tecla ESC abaixo ------> substituir função
VAR=date
----------------------->echo $VAR -- --> Função de data de chamada
( ) equivalente: VAR = () equivalente: VAR=( ) equivalente : V A R= (data)
C. Substituição Aritmética
VAR=33,eco $((VAR+3)) == eco ( ( ((( ( VAR+3)) == echo $[ VAR+3]
echo $[ 2#10 +11]//2 base 10+(decimal) 11
D. Caractere de escape: \
touch $\ \test.sh ---- > generate $ test.sh delete também é
touch ./-abc -abc
equivalente touch – -abc
touch ./-------xyz ------- xyz
F. Aspas simples aspas duplas
VAR=
date
eco ' VAR' eco " VAR' eco "GUERRA _ _′ eho"VAR"
G. Testes condicionais e símbolos de comparação
VAR=2
teste $VAR -gt 1
símbolo de comparação
-gt é maior que ou não
-lt é menor que
-qt é maior que
-eq é igual a
-ne não é igual a
-d é um diretório
-f é um diretório normal
-p arquivo especial
-z para determinar se a string é 0
-n não é 0
H. e ou não
-a é e &&
-o é ||
-x é ^
VAR=abc
F. Declaração de filial
se [-d t.txt]; então
内容
fiEspecial
if: ;then echo "always true" ; fi
*** Nota: significa sempre verdadeiro
código de teste
#! /bin/bash
echo "Is it morning? please answer yes or no"
#相当于fgets()
read YES_OR_NO
if [ "$YES_OR_NO" = "yes" ]; then
echo "Good morning !"
elif [ "$YES_OR_NO" = "no" ]; then
echo "Bad weather!!"
else
echo "Sorry, $YES_OR_NO not recognize. Enter yes or no"
fi
caso “$VAR” em
y] ;;
N];;
] ;;
;;---->代表break
read -p "por favor insira o primeiro número n1 " n1
#! /bin/bash
echo "Is it morning? please answer yes or no"
#相当于fgets()
read YES_OR_NO
#取放到集合里面IN
case "$YES_OR_NO" in
#注意只有)2
yes|y|YES|Yes)
echo "Good morning !";;
no|No)
echo "Bad weather!!";;
*)
echo "Sorry, $YES_OR_NO not recognize. Enter yes or no"
return ;;
esac
Loop
foreach - percorre for/do/done
para sth em $@ ;do
done
#! /bin/bash
echo "Enter Yes or No"
for FILENAME in $(ls); do
printf "$FILENAME "
if [ -f "$FILENAME" ];then
echo " "$FILENAME" is a file"
else
echo "It is not a file"
fi
done
enquanto []; faça
feito
#! /bin/bash
count=3
echo "Enter password"
read TRY
while [ "$TRY" != "secret" -a $count -gt 0 ]
do
count=$[count-1]
echo "Sorry ,try again"
read TRY
done
ler
read -p 读取控制台输入的值并赋予num1
read -p "please write a num " NUM1
echo "you write num is $NUM1"
-t是在规定时间为10秒内没有输入时就会直接执行下面的语句
read -t 10 -p "please write a num " NUM2
echo "the else num is $NUM2"
G. Construção de função
#! /bin/bash
#一次创建多个目录,目录名字从参数中传进取,脚本测试目录是否存在,如果不存在,先打印不存在的信息然后创建该目录
is_directory()
{
DIR_NAME=$1
#从参数中判断
if [ ! -d $DIR_NAME ]; then
#如果文件存在则返回
return 1
else
return 0
fi
}
#命令行参数调用
for DIR in "$@"; do
if is_directory "$DIR";then
echo "file have already created "
else
echo "$DIR doesn't exist. Create it now..."
#标准输出重建到黑洞里面不管创建成功还是失败他都会重定向到黑洞里面
mkdir $DIR > /dev/null 2>&1
#创建失败则退出程序
if [ $? -ne 0 ]; then
echo "Can't create directory $DIR"
exit 1
fi
fi
done
H. Parâmetros posicionais e variáveis especiais! ! !
$0 Obtém o nome do arquivo de execução
$nn leva 1-n para indicar os parâmetros passados pelo arquivo de execução
$# Obtém o número total de parâmetros
$* Imprime todos os parâmetros em uma linha
$@ Imprime n linhas de n parâmetros para o for instrução
$? Imprime a última execução O resultado de
$$ imprime o PID do script executado
shift desloca o parâmetro para a esquerda
echo -n "hello\n" não analisa o caractere de escape
echo -e "hello\n" analisa o caractere de escape
G. pipe e redirecionamento de arquivo
tee
ps aux | grep init | tee out ====>As informações filtradas são armazenadas no arquivo out e exibidas na tela
cmd > arquivo
cmd >> arquivo
cmd > arquivo 2>&1> sem espaços depois=> Redirecionar saída como entrada padrão=> conteúdo para arquivo
cmd < arquivo > arquivo2 === < redireciona o conteúdo do arquivo para a tela e redireciona para arquivo2 dentro de
wc -l test_if_case.sh > out
cat < test_if_case.sh > out
cmd < &fd === == ===> Tratar descritores de arquivo como entrada padrão
cmd > &fd ========> Tratar descritores de arquivo como saída padrão
cmd < &- Fechar saída padrão