《鸟哥的linux私房菜》 第三部分 学习 shell 与 shell script 总结
/etc/shells 文件 用于记录 系统上合法的shell。 为什么要有这个文件? 因为系统某些服务在运行过程中,会去检查用户能使用的shell,而这些shell的查询就是借助/etc/shells这个文件。
/etc/passwd 文件 里面 记录了 每个 用户 默认 会 使用 那种shell
~/.bash_history 记录 前一次登录以前所执行的命令
type 命令 用于 显示 命令 name 是不是 内置 命令 或是 别名等等
为了区别 自定义变量与 bash环境操作变量 的不同 环境变量通常用大写
显示 变量
列:echo $PATH 或 echo ${PATH}
设置 变量
列:echo $myname 没有结果 说明 没有 定义
直接 输入 myname=billvsme 就 设置 myname变量 为 billvsme
变量设置规则
1. 等号两边 不能直接 接 空格 列:myname=VBird Tsai ERROR
2.变量名只能是 数字 或 字母 但 开头 只能是 字母 列 2myname=billvsme ERROR
3. 变量内容可用 " " 或 ' ' 包起来 但 " " 可保持原有性质 列:var= "lang is $LANG" echo $var 可得
lang is zh_CN.UTF-8 。 但 ' ' 内 自保留 原本的一般字符 列:var= lang is $LANG' echo $var 可得
lang is $LANG
4.可用使用 转义字符 “\”
5 . 可以用 $ 或 ` ` 来 在变量内容里使用命令
列 ver="version is $(uname -r)" 或 ver="version is `uname -r`"
echo $ver 可得 version is 3.10.7-gentoo
6.若要为已有的变量增加内容,可用 这样做
列: PATH="$PATH":/usr/game/bin
7.若该变量需要在其他子进程执行,则需要已export来使变量成为环境变量
如 export ver 再export 就可用看到 ver了
取消 变量 unset name
查看默认环境变量 env或export
RANDOM 是随机数变量 ,可以产生0~32767 之间的数 就是 。/dev/random 文件
如果想要0~9 之间 可以
declare -i number=$RANDOM*10/32768; echo $unmber
查看所有变量 set
语言变量 locale
locale -a 显示 支持多少语系
直接locale 可以 查看当前用户的语言,设置这些变量可以改变当前用户的语系
系统整体默认的语系放在
CentOs 等 /etc/sysconfig/il8n
gentoo /etc/env.d/xxlocale;
变量键盘读取、数组与声明:read,array,declare
read 列 read -p "your name:" -t 30 name
会显示 your name: 然后 输入 billvsme , 如果不输入等待 30秒
echo $name 会显示 billvsme
declare / typeset [-aAfFgilrtux] [-p] [name[=value] ...]
-a 定义 为数组 ;-i 定义为整形 ;-x 跟 export 一样 把 name 设置 为 环境 变量 ;-r 设置 为readonly;-p 显示 name 的 类型(declare -p name)
(变量默认类型为字符串 )
列 当 我们 输入 sum=100+200+300 时 在 echo $name 显示 100+200+300 没有显示 600。我们 declare -i sum=100+200+300 再 echo $name 显示 600。
当再 declare -x sum (或export sum) 在 export | grep sum 可以看到
declare -ix sum="600" 包括 声明 时 的 ix 我们可以 再 delare -r sum sum 就 变得 readonly。
我们还可以 把 “ - ” 变成 “+” 这表示 取消 这个 属性 列 declare +x sum 这样 再 export 就看不到 sum了
读取数组 最好 用 echo ${var[1]}。
与文件系统及程序的限制关系:ulimit
ulimit -a 可以列出所有的限制额度 具体 见 man bash 搜索 ulimit
想要恢复ulimit 的设置追简单的方法就是注销再登陆
变量内容的删除、替代与转换
删除
eg=1234567
echo ${eg#12} 34567
echo ${eg#1*6} 7
echo ${eg#45} 1234567
eg=123456123456
echo ${eg##12} 3456123456
echo ${eg##1*2} 3456
#:符合替换文字的“最短的”那一个 后面的第一个 一定要是 变量的第一个
##符合替换文字的“最长的”那一个
%,%% 是从后面删起 ,其他 跟#,##一样
替换
eg=abcdeabcde
echo ${eg/a/A} Abcdeabcde
echo ${eg//a/A} AbcdAabcde 两根斜杠 表示所有符合的都要被替换
检测再置换 当没有设置eg变量时
eg=${eg-abcde} ; echo eg
看到 abcde
当已经设置了eg 变量 如 eg=123456
eg=${eg-abcde} ; echo eg
看到还是 123456 不会改变
注意: 如果eg="" eg为空 虽然 看起来 没有 东西 但已经定义 了eg=${eg-abcde} 不行
但是 可以通过 eg=${eg:-abcde} " - "前加个" : "表示 当eg是空 或者 未设置 都能替换
" ? " 当eg2 没有设置时 eg=${eg2?无此变量}; 会 显示 “ bash: eg2: 无此变量 ” 的错误
当 eg2 设置时 eg 会 变成 跟 eg2 一样
直接 alias 可以看到设置了那些 命令别名
设置命令别名 alias lm='ls -l | more'
取消命令别名 unalias lm
history 可以历史命令
history [n]
history [-c]
history [-raw] histfiles
n : 数字,列出 最近的n条命令
-c : 将目前shell内的所有history内容全部删除
-a : 将目前新增的history命令新新增入 histfiles中,如果没有写histfiles,则默认写入~/.bash_history
-r : 将histfiles的内容 写入到 shell的history中
-w : 将 目前shell的内容写入到histfiles 中
!66 执行第66条命令
!! 执行上一次的命令
!al 执行最近一次以al开头的命令