echo
用于终端打印的最基本命令。默认情况下,echo在每次调用后都会添加一个换行符,echo打印的文本,一种是被双引号包括的文本,一种是被单引号包括的文本,还可以不适用双引号和单引号。区别是:使用双引号包括的文本中,如果文本中含有特殊字符,会被解释,而单引号中对特殊字符不做任何处理。对于转义字符,可以使用\来进行转义
[ld@localhost workspace]$ echo "hello world $0"
hello world bash
[ld@localhost workspace]$ echo 'hello world $0'
hello world $0
[ld@localhost workspace]$ echo hello world $0
hello world bash
[ld@localhost workspace]$ echo hello world \!
hello world !
printf
printf接受饮用文本或由空格分隔的参数,可以使用格式控制符来对输出进行控制,和C语言的printf函数相似,%s %d %f都是格式控制符,定义了如何带引后续参数,%-4s指明格式为左对齐且宽度为4的字符串替换,没有-号为右对齐,对于s来说,宽度指明保留某个字符串的字符数量,不足以空格填充,对于浮点数,整数部分指明整个浮点数的宽度,小数部分指明保留几位小数。
[ld@localhost workspace]$ printf "%4s %4d %3.2f\n" liu 23 3.1445
liu 23 3.14
变量赋值
varName=value 注意: 等号的左右两边没有空格。varName是变量名,value是要赋予的值,如果value不包含任何空白字符,就不需要将其放入到引号中,否则必须使用单引号或双引号。
[ld@localhost workspace]$ name=ld
[ld@localhost workspace]$ name=ld d
bash: d: command not found...
[ld@localhost workspace]$ name="ld d"
变量的获取使用$varName 或者 ${varName}
[ld@localhost workspace]$ echo $name
ld d
[ld@localhost workspace]$ echo ${name}
ld d
Shell内建特性:
获取字符串的长度,以及识别当前所使用的shell.
[ld@localhost workspace]$ echo ${#name}
4
[ld@localhost workspace]$ echo $SHELL
/bin/bash
修改Bash的提示字符串
当我们打开终端或运行shell时,看到类型的ld#localhost path $提示字符串,不同的GNU/Linux发布版中的提示字符串和颜色各不相同,可以利用PS1环境变量来定义主提示字符串,默认的提示字符串在文件~/.bashrc中的某一行设置。
# User specific aliases and functions
PS1="FIGHTING..."
FIGHTING... ls
app Documents hadoopHello.jar Pictures Templates tetConfiguration.jar WindowsTB
Desktop Downloads Music Public test.txt Videos workspace
FIGHTING...
shell进行数学运算
⑴使用let命令⑵使用操作符[]⑶使用操作符(())⑷使用expr
FIGHTING...num=5
FIGHTING...let num++
FIGHTING...echo $num
6
FIGHTING...num=$[ num + num ]
FIGHTING...echo $num
12
FIGHTING...num=$(( num + num ))
FIGHTING...echo $num
24
FIGHTING...num=`expr 6 + 6`
FIGHTING...echo $num
12
文件描述符与重定向
文件描述符是与输入和输出相关联的整数。文件描述符有标志输入,标准输出,标准错误,stdin,stdout,stderr.我们可以将文件描述符重定向到另一个文件描述符中。
默认情况下,正常输出和错误输出都会显示在屏幕上,文件描述符是与某个打开的文件或数据流相关联的整数。文件描述符0,1,2对应标准输入,标准输出,标注错误。
重定向:
使用>,将输出的文本保存在后面的文件中,如果后面文件已经存在,则大于号会清空该文件中先前的内容
使用>>,将输出的文本追加到后面的文件中。
使用<,使用stdin那样从文件中读取数据。
FIGHTING...cat test.txt
hello world
===========
-- name : liudong
FIGHTING...echo ">>>>>" > test.txt
FIGHTING...cat test.txt
>>>>>
FIGHTING...echo "<<<<<>>>>>>" >> test.txt
FIGHTING...cat test.txt
>>>>>
<<<<<>>>>>>
FIGHTING...
注意:当命令成功执行后,它会返回为0的退出状态,退出状态可以从特殊变量$?中获得。当一个命令发生错误并退出时,它会返回一个非0的退出状态。
重定向和文件描述符结合:
使用2>xxx,会将stderr重定向到xxx文件中;
使用1>xxx,会将stdout重定向到xxx文件中;
FIGHTING...cmd 2>stderr.txt 1>stdout.txt
FIGHTING...cat stderr.txt
bash: cmd: command not found...
Similar command is: 'mcd'
FIGHTING...cat stdout.txt
也可以使用管道实现重定向数据到文件,还可以提供一份重定向数据的副本作为管道中后续命令的stdin.
command | tee File1 File2 | othercommand
数组
FIGHTING...array=(1,2,4,5,6)
FIGHTING...echo $array
1,2,4,5,6
FIGHTING...echo ${array[0]}
1,2,4,5,6
FIGHTING...array2[1]=1
FIGHTING...array2[2]=2
FIGHTING...echo ${array2[0]}
FIGHTING...echo ${array2[1]}
1
FIGHTING...echo ${array2[*]}
1 2
FIGHTING...echo ${array2[@]}
1 2
FIGHTING...echo ${#array2[*]}
2
FIGHTING...
别名
alias new_command='command sequence'
alias命令的效果暂时的,一旦关闭当前终端,所有设置过的别名就失效了,为了使别名在所有的shell中都可用,可以将其放入~/.bashrc文件中,每当交互式shell进程生成时,都会执行~/.bashrc中的命令。
注意:创建一个和愿生命令同名的别名很容易,如果有人恶意修改别名为重要的命令,则可以转义要使用的命令,忽略当前定义的别名:\command
日期
Unix纪元时定义为从世界标准时间UTC(1970年1月1日0时0分0秒起至当前时刻的总秒数,不包括闰秒)
读取日期: date
打印纪元时: date %s
用带有前缀+的格式化字符串作为date命令的参数: date "+%d %B %Y"
函数
函数的定义包括function命令,函数名,开闭括号以及包含一对花括号中的函数体。
#!bin/bash
function test()
{
echo "this is a function "
}
test
test2()
{
echo "this is a function2"
}
test2
test3()
{
echo $1,$2;
echo "$@";
echo "$*";
return 0;
}
test3 zhang san li si
FIGHTING...bash std.sh
this is a function
this is a function2
zhang,san
zhang san li si
zhang san li si
FIGHTING...
参考《Linux Shell 脚本攻略》