随笔--Linux系统环境

本文介绍Linux系统环境的基本概念、配置方法及Shell脚本的编写技巧。涵盖.profile和.bashrc文件的使用、环境变量如PATH的设置、别名定义、历史命令管理等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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变量在使用之前可以不必显式地进行声明--没有赋值的变量等于包含空字符串的变量。引用未定义的变量不会抛出错误。
![有点懒呢](https://img-blog.youkuaiyun.com/20150806165334539)
  • 变量的赋值

    变量的赋值方式主要有三种:
    显示定义: 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值