Linux系统环境
基本概念
环境配置方法
-shell配置文件
-环境变量
个人配置主要集中在~/.profile($HOME/.profile)文件中。
打开新的交互式shell时,配置文件的执行顺序是/etc/profile、/etc/bash.bashrc(如果使用bash shell)、~/.profile,最后是~/.bashrc。所有的shell都会读取~/.profile,因此最好将通用设置写入其中,然后将于bash相关的设置写入~/.bashrc中。
-PATH
系统的主要命令都在 /bin、/usr/bin、/sbin和/usr/sbin中,但也可以在$HOME/bin、$HOME/scripts、/usr/local/bin 或其他位置放置用户编写的脚本。将这些路径添加到PATH中,这样可以让shell找到这些路径,即使当前并不处于这些路径下:
PATH=${PATH}:${HOME}/bin
如果没有PATH,则需提供命令的显式路径(绝对路径或者相对路径)。例如:
$myscript.sh
bash:myscript.sh:command not found
$/home/steve/bin/myscript.sh 或者
$cd /home/steve/bin/
$./myscript.sh
-别名
-1.less
alias less='less -X'
-2. cp 、rm和mv别名
一些linux的发型版本特别是Redhat,都是Redhat Enterprise Linux的二进制兼容的克隆版本,所以它们为cp、rm、mv命令精心定义了一些别名。这些别名都使用了 -i选项,进行交互式询问操作。 如果不喜欢此种不停询问的方式,可以在~/.bashrc中将他们删除。命令unalias rm 就删除了rm的别名。
[root@localhost ~]# cat .bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
[root@localhost ~]#
如果一直某个命令是别名,可以用两种方法来使用原始命令,一种是完整路径机制,另一种是在命令的前面加上反斜线,\rm将调用非别名的命令。
-ls别名
因为ls是一个非常常用的命令,所以很多流行的ls的别名,最常见的是表示ls -l的与表示ls -a的la,一些流行的ls别名包括下面这些:
alias l='ls'
alias ll='ls -l'
alias la='ls -A'
可以通过配置文件进行设置,也可以直接在shell下执行
-其他简写命令
--浏览器
alias bbc='firefox http://www.bbc.co.uk/ &'
alias sd='firefox http://slashdot.org/ &'
alias www='firefox'
--ssh命令
alias declan='ssh declan'
alias work='ssh work.example.com -p 222'
alias workweb='ssh work.example.com -p 222 -L 80:proxy.example.com:8080'
-修改历史命令
history
设置histappend可以防止历史记录被覆盖。
HISSIZE定义shell会话在命令历史文件中最多能存储的命令条数;
HISTFILESIZE定义历史文件的最大尺寸。
HISTIGNORE是一个用冒号隔开的命令列表,列表中的命令不会存储在列表文件中。
HISTCONTROL可以告诉history忽略前导空格,也可以用于忽略重复命令,可以设置为ignorespace、ignoredups或者ugnoreboth。 ~/.bashrc中与历史相关的一段设置可能如下所示:
shopt -s histappend
export HISTSIZE=100000
export HISTFILESIZE=409600
export HISTIGNORE=":pwd:id:update:resize:ls:clear:history:"
export HISTCONTrol=ignoredups
变量
- 使用变量
引用变量时,必须将$符号置于变量名之前,否则会被当做普通字符串;
echo $PATH
当向变量中写入值时,则不需要$符号;
YOUR_NAME=steve
echo "The variable YOUR_NAME is $YOUR_NAME"
- 类型
shell没有类型一说,将任何变量都可以看做字符串。
shell变量在使用之前可以不必显式地进行声明--没有赋值的变量等于包含空字符串的变量。引用未定义的变量不会抛出错误。

变量的赋值
变量的赋值方式主要有三种:
显示定义: VAR=value
读取: read VAR
命令替换: VAR=date
、VAR=$(date)
1.显示定义:VAR=value
等于符号两边不允许有空格;
错误用例: variable = foo
上边的代码被当成带有两个参数的命令(variable):参数是=和foo。
该语法是一个较常用的技术的特例,如果要在某个环境下运行一个命令,而不改变调用shell的环境,可以在命令之前加上变量赋值:
LB_LIBRARY_PATH=/usr/mozilla/lib firefox
一旦用正确的语法对变量进行了赋值,就可以用$符号作为前缀来访问变量:
$ variable=foo
$ echo $variable
foo
$
2.读取: read VAR
使用read命令可以交互式地对变量进行赋值:
$cat first.sh
#!/bin/bash
read myvar
echo "myvar is $myvar"
如果运行该脚本,它会提示一行输入,并将变量myvar赋值作为用户的输入。
可以通过回显一条提示让脚本更人性化。echo的-n开关告诉echo在末尾不输出换行符,所以提示语和输入都在同一行显示:
echo -n "Enter your name: "
read myvar
echo "Hello $myvar"
交互式运行如下所示:
$ ./first.sh
Enter your name: Steve
Hello Steve
$ ./first.sh
Enter your name: Steve Parker
Hello Steve Parker
也可以使用read一次性读入多个变量:
echo -n "Please enter your first name and last name: "
read firstname lastname
echo "Hello,$firstname. How is the $lastname family?"
3.从文件读取
我们可以使用read命令从文件(终端读取也是文件读取,unix下一切皆文件)读取文本行。
--读取一行
read message < /etc/motd
echo $message
Linux goldie 2.6.232-5-amd64 #1 SMPFri Oct 15 00:56:30 UTC 2010 x86_64
$
--循环读取所有行
$ while read message
> do
> echo $message
> done < /etc/motd
--循环读取所有行(暂停1秒)
$ while read message
> do
> echo $message
> sleep 1
> date
> done < /etc/motd
4.命令替换: VAR=`date`、VAR=$(date)
例:
$cat today.sh
#!/bin/bash
TODAY=`date +%A`
echo "TODAY is $TODAY"
$ ./today.sh
Today is Monday
$
- 位置参数
调用脚本时,参数传递有很大作用。
$0 是命令本身的名称,$1是第一个参数,$2是第二个参数,依此类推。
典型的脚本用basename命令去掉位置参数的路径信息;所以./params.sh、/usr/local/bin/params.sh和~/bin/params.sh都被转换为params.sh。
脚本并不知道被调用时使用了多少个参数,对参数数目进行检测也很重要。$#告诉脚本调用时使用参数的数目,例如: if [ "$#" -ne "2" ]
参数个数大于9时,需要使用新的参数接收方法,使用shift内置命令每次调用时,将所有参数进行一次移位,首先截去$1,然后截去$2,然后截去$3等。无法将移位逆向进行,所以应当确保在调用之前已完全处理过将被移除的参数。
例:
$ cat manyparams.sh
#!/bin/bash
echo "My name is `basename $0` - I was called as $0"
echo "I was called with $# parameters."
count=1
while[ "$#" -ge "1" ]; do
echo "Parameter number $count is : $1"
let count=$count+1
shift
done
$ ./manyparams.sh one two three
My name is manyparams.sh - I was called as ./manyparams.sh
I was called with 3 parameters.
Parameter number 1 is one
Parameter number 2 is two
Parameter number 3 is three
$ ./manyparams.sh one two three four five six seven eight nine ten eleven twelve
My name is manyparams.sh - I was called as ./manyparams.sh
I was called with 12 parameters.
Parameter number 1 is one
Parameter number 2 is two
Parameter number 3 is three
……
Parameter number 11 is eleven
Parameter number 12 is twelve
$
所有的参数:
最后两个读取传递的参数的变量时$*和$@.
后台进程
使用变量$!可以找到其进程ID。
#!/bin/sh
ls -R /temp &
sleep 10
strace -p $!
同时读取多个变量
$cat datafile
the quick brown fox
$read field1 field2 field3 < datafile
$echo field one is $field1
field one is the
$echo field one is $field2
field one is quick
$echo field one is $field3
field one is brown fox
$
如果文件中的输入不够,则后面的变量为空
$echo the quick > datafile
$read field1 field2 field3 < datafile
$echo field one is $field1
field one is the
$echo field one is $field2
field one is quick
$echo field one is $field3
field one is
$
常用技巧
使用下面的语法来设置$one=1、$two=2、$three=3和$four=4
echo 1 2 3 4 | read one two three four
使用while读取
例:使用while 读取 /etc/hosts的前两个单词
while read ip name alias
>do
> if [ ! -z "$name"]; then
> echo -en "IP is $ip - its name is $name"
> if [ ! -z "$aliases" ]; then
> echo "Aliases: $aliases"
> else
> echo
> fi
> fi
> done < /etc/hosts
- 删除变量
unset 变量名
将变量赋值为空字符串也能实现变量的删除
有些变量无法删除,称之为“只读”变量。例如:$1、$2和$#等变量
预定义变量和标准变量
$BASH_ENV
$BASHOPTS
$SHELLOPTS
$BASH_COMMAND
$BASH_SOURCE、FUNCNAME、LINENO和BASH_LINENO
$HOSTNAME、$HOSTTYPE
$OLDPWD `pwd`
$PIPESATUS
$TIMEFORMAT
$PPID
$RANDOM
$REPLY
$SECONDS
$HOME
$IFS
$PATH
$TMOUT 超时退出shell
$TMPDIR
用户标识变量
通常使用如下方法,在运行特权级脚本前检查用户是否为root用户:
#!/bin/bash
if [ "$UID" -ne "0" ]; then
echo "Sorry , you are not root."
exit 1
else
echo "Your are root - you may proceed"
fi