博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux基础6-bash shell编程
阅读量:4605 次
发布时间:2019-06-09

本文共 8043 字,大约阅读时间需要 26 分钟。

1. type [-ta] name

ABAWYiG.png

一般情况下,type命令被用于判断另外一个命令是否是内置命令,但是它实际上有更多的用法。
1.1.判断一个名字当前是否是alias、keyword、function、builtin、file或者什么都不是:

type ls 的输出是 ls 是 `ls --color=auto' 的别名        type if 的输出是 if 是 shell 关键字        type type 的输出是 type 是 shell 内嵌        type gedit 的输出是 gedit 是 /usr/bin/gedit        type frydsh 的输出是 bash: type: frydsh: 未找到

1.2.判断一个名字当前是否是alias、keyword、function、builtin、file或者什么都不是的另一种方法(适用于脚本编程):

type -t ls 的输出是 alias        type -t if 的输出是 keyword        type -t type 的输出是 builtin        type -t gedit 的输出是 file        type -t frydsh 没有输出

1.3.显示一个名字的所有可能:

type -a kill 的输出是 kill 是 shell 内嵌 和 kill 是 /bin/kill        type -at kill 的输出是 builtin 和 file

1.4.查看一个命令的执行路径(如果它是外部命令的话):

type -p gedit 的输出是 /usr/bin/gedit        type -p kill 没有输出(因为kill是内置命令)

1.5.强制搜索外部命令:

type -P kill 的输出是 /bin/kill

2. 环境变量和自定义变量的显示命令

kfCyDke.png

2.1 env命令的显示:

[root@www.linuxidc.com ~]# env

HOSTNAME=web -主机名称
TERM=linux -终端
SHELL=/bin/bash -shell
HISTSIZE=1000 -历史存储命令书
SSH_CLIENT=58.222.185.248 1113 22 -登录ip 端口 ssh登录端口
SSH_TTY=/dev/pts/6 -远程登录pts
ANT_HOME=/opt/apache/apache-ant-1.8.1
USER=root -用户
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:.cmd=01;32:.exe=01;32:.com=01;32:.btm=01;32:.bat=01;32:.sh=01;32:.csh=01;32:.tar=01;31:.tgz=01;31:.arj=01;31:.taz=01;31:.lzh=01;31:.zip=01;31:.z=01;31:.Z=01;31:.gz=01;31:.bz2=01;31:.bz=01;31:.tz=01;31:.rpm=01;31:.cpio=01;31:.jpg=01;35:.gif=01;35:.bmp=01;35:.xbm=01;35:.xpm=01;35:.png=01;35:.tif=01;35: -颜色的设置信息
SSH_AUTH_SOCK=/tmp/ssh-amfuW25778/agent.25778
MAIL=/var/spool/mail/root -mail
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/opt/apache/apache-ant-1.8.1/bin:/usr/ java/jdk1.6.0_20/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin -路径
INPUTRC=/etc/inputrc -键盘
PWD=/root -当前工作路径
JAVA_HOME=/usr/java/jdk1.6.0_20
LANG=zh_CN.GB18030 -语言
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SHLVL=1
HOME=/root
LOGNAME=root
CVS_RSH=ssh
SSH_CONNECTION=58.222.185.248 1113 218.23.142.44 22
LESSOPEN=|/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
_=/bin/env

2.2 set命令的显示

[root@www.linuxidc.com ~]# set | more

ANT_HOME=/opt/apache/apache-ant-1.8.1
BASH=/bin/bash
BASH_ARGC=()
BASH_ARGV=()
BASH_COMPLETION=/etc/bash_completion
BASH_COMPLETION_DIR=/etc/bash_completion.d
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i686-RedHat-linux-gnu")
BASH_VERSION='3.2.25(1)-release'
COLORS=/etc/DIR_COLORS
COLUMNS=132 -显示的列数
CVS_RSH=ssh
DIRSTACK=()
EUID=0
GROUPS=()
G_BROKEN_FILENAMES=1
HISTFILE=/root/.bash_history -history文件保存的地址
HISTFILESIZE=1000
HISTSIZE=1000
HOME=/root
HOSTNAME=web
HOSTTYPE=i686
IFS=$' \t\n'
INPUTRC=/etc/inputrc
JAVA_HOME=/usr/java/jdk1.6.0_20
LANG=zh_CN.GB18030
LESSOPEN='|/usr/bin/lesspipe.sh %s'
LINES=41
LOGNAME=root
LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:.cmd=01;3
2:
.exe=01;32:.com=01;32:.btm=01;32:.bat=01;32:.sh=01;32:.csh=01;32:.tar=01;31:.tgz=01;31:.arj=01;31:.taz=01;31:.lzh=01;31
:.zip=01;31:.z=01;31:.Z=01;31:.gz=01;31:.bz2=01;31:.bz=01;31:.tz=01;31:.rpm=01;31:.cpio=01;31:.jpg=01;35:.gif=01;35:.bmp
=01;35:.xbm=01;35:.xpm=01;35:.png=01;35:.tif=01;35:'
MACHTYPE=i686-RedHat-linux-gnu
MAIL=/var/spool/mail/root
MAILCHECK=60 -每过60s检查一次邮箱
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
--More--

后面还有PS1:命令提示符等

2.3 export命令的显示:

将用户自定义的变量编程环境变量用export

export 功能说明:设置或显示环境变量。
语  法:export [-fnp][变量名称]=[变量设置值]
补充说明:在shell中执行程序时,shell会提供一组环境变量。export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅限于该次登陆操作。
参  数:
 -f  代表[变量名称]中为函数名称。
 -n  删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。
 -p  列出所有的shell赋予程序的环境变量。

[root@www.linuxidc.com ~]# export

declare -x ANT_HOME="/opt/apache/apache-ant-1.8.1"
declare -x CVS_RSH="ssh"
declare -x G_BROKEN_FILENAMES="1"
declare -x HISTSIZE="1000"
declare -x HOME="/root"
declare -x HOSTNAME="web"
declare -x INPUTRC="/etc/inputrc"
declare -x JAVA_HOME="/usr/java/jdk1.6.0_20"
declare -x LANG="zh_CN.GB18030"
declare -x LESSOPEN="|/usr/bin/lesspipe.sh %s"
declare -x LOGNAME="root"
declare -x LS_COLORS="no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:.cmd=01;32:.exe=01;32:.com=01;32:.btm=01;32:.bat=01;32:.sh=01;32:.csh=01;32:.tar=01;31:.tgz=01;31:.arj=01;31:.taz=01;31:.lzh=01;31:.zip=01;31:.z=01;31:.Z=01;31:.gz=01;31:.bz2=01;31:.bz=01;31:.tz=01;31:.rpm=01;31:.cpio=01;31:.jpg=01;35:.gif=01;35:.bmp=01;35:.xbm=01;35:.xpm=01;35:.png=01;35:.tif=01;35:"
declare -x MAIL="/var/spool/mail/root"
declare -x OLDPWD
declare -x PATH="/usr/kerberos/sbin:/usr/kerberos/bin:/opt/apache/apache-ant-1.8.1/bin:/usr/java/jdk1.6.0_20/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"
declare -x PWD="/root"
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_ASKPASS="/usr/libexec/openssh/gnome-ssh-askpass"
declare -x SSH_AUTH_SOCK="/tmp/ssh-amfuW25778/agent.25778"
declare -x SSH_CLIENT="58.222.185.248 1113 22"
declare -x SSH_CONNECTION="58.222.185.248 1113 218.23.142.44 22"
declare -x SSH_TTY="/dev/pts/6"
declare -x TERM="linux"
declare -x USER="root"

2.4 PS1命令提示符:

\d :代表日期,格式为weekday month date,例如:"Mon Aug 1"

  \H :完整的主机名称。例如:我的机器名称为:fc4.linux,则这个名称就是fc4.linux

  \h :仅取主机的第一个名字,如上例,则为fc4,.linux则被省略

  \t :显示时间为24小时格式,如:HH:MM:SS

  \T :显示时间为12小时格式

  \A :显示时间为24小时格式:HH:MM

  \u :当前用户的账号名称

  \v :BASH的版本信息

  \w :完整的工作目录名称。家目录会以 ~代替

  \W :利用basename取得工作目录名称,所以只会列出最后一个目录

  # :下达的第几个命令

  $ :提示字符,如果是root时,提示符为:# ,普通用户则为:$

如果想要设置终端提示符的样式只要把$PS1在~/.bahrc指定即可比,比如我的设置如下:

设置一:
PS1="[\e[32m][\u@\h \w]$[\e[m]"
export PS1
效果:
[LinuxSong@test ~]$

设置二:

if [ $TERM = 'linux' ]; then

export PS1="[[\e[36;1m]\u@\h [\e[31;1m]\w[\e[32;1m]]> "
zhcon --utf8
clear
elif [ $TERM = "xterm" ]; then
export PS1="[[\e[31;1m]\w\e[0m]> "
fi

2.5 bash下变量的设定的规则:

CeV2JGm.png

重点有三点:4、5、6

2.6 linux语系的问题:

l73vs9B.png

查找当前使用的语系:echo $LANG

显示系统支持的所有语系:locale -a

临时修改语系

1 [linux@linux~]$ LANG=zh_CN.gb2312

2 [linux@linux~]$ echo $LANG
3 zh_CN.gb2312

永久修改语系

1 [linux@linux~]$ vi /etc/sysconfig/i18n

2 LANG="en_US.UTF-8"
3 SYSFONT="latarcyrheb-sun16"

使修改立即生效

1 [linux@linux~]$ source /etc/sysconfig/i18n

注:如果在修改语系后,仍然有乱码,则需要修改编辑器的设置,设置方式如图所示,需要将character encoding修改为对应的语系

TksIenk.png

2.7 键盘读取变量和声明变量:

c0OKcBS.png

read -p "please input your name:" -t 30 name

declare(转自:http://www.cnblogs.com/fhefh/archive/2011/04/22/2024857.html)

declare或typeset内建命令(它们是完全相同的)可以用来限定变量的属性.这是在某些编程语言中使用的定义类型不严格的方式。命令declare是bash版本2之后才有的。命令typeset也可以在ksh脚本中运行。

declare/typeset 选项

-r 只读

1 declare -r var1

(declare -r var1与readonly var1作用相同)

这大致和C的const限定词相同.一个试图改变只读变量值的操作将会引起错误信息而失败.

-i 整数

1 declare -i number2 # 脚本余下的部分会把"number"当作整数看待.        3 4 number=35 echo "Number = $number" # Number = 36 7 number=three8 echo "Number = $number" # Number = 09 # 脚本尝试把字符串"three"作为整数来求值(译者注:当然会失败,所以出现值为0).

某些算术计算允许在被声明为整数的变量中完成,而不需要特别使用expr或let来完成。

1 n=6/32 echo "n = $n"       # n = 6/33 4 declare -i n5 n=6/36 echo "n = $n"       # n = 2

-a 数组

1 declare -a indices

变量indices会被当作数组.

-f 函数

1 declare -f

在脚本中没有带任何参数的declare -f 会列出所有在此脚本前面已定义的函数出来。

1 declare -f function_name

而declare -f function_name则只会列出指定的函数.

-x export

1 declare -x var3

这样将声明一个变量作为脚本的环境变量而被导出。

-x var=$value

1 declare -x var3=373

declare命令允许在声明变量类型的时候同时给变量赋值。

2.8 系统和个人设定值存储的文件:

4axE72T.png

XjuWxWr.png

QEzmRVc.png

执行顺序依次为

/etc/profile

.bash_profile

.bashrc

/etc/bashrc

3. 命令别名与历史命令

aEnicDp.png

alias 别名='原命令'

  作用:设置别名

  别名设置存放在文件 ~/.bashrc 中 ,修改这个文件可永久生效 ~表示家目录

eg:alias 显示所有的alias设置

unalias 删除别名

history [选项]

  作用:查看使用过的命令

  参数:

  -c 清空历史命令

  -w 把缓存中的命令保存到文件中 文件存放在~/.bash.history中 其中~代表家目录

  说明:历史命令默认保存1000条 当超过1000条时会删除开始的历史命令 记录下新的命令 ,默认设置在 /etc/profile 中

  echo $HISTSIZE 可以查看历史记录的当前设置的条数

eg:history -w hisfile 把shell中的执行记录写入到hisfile中
:history -r hisfile 把hisfile中的命令记录读取到shell中

4. bash shell使用环境的终端的环境设置

4.1 stty -a:

stty -a 将当前所有的stty参数列出来

0ickakn.png

zmJUXZh.png

4.2 修改delete向前删除为backspace向前删除:

如上图所示删除为^?(delete)如果需要改成^H(bacespace)

则需使用以下命令

eg:stty erase ^H

4.3 通用字符和特殊符号:

3rpdXFg.png

PO1hMkp.png

4.4 组合按键:

fVkmQVF.png

5. 数据重导向

CxHDBAW.png

5.1 数据重导向:

u44RV1L.png

5.2 tee-双向重导向:

an2Su4M.png

5.3 命令执行的判断依据:

7VzYIPq.png

6. 管道命令

LWAncG7.png

6.1 cut和grep的选取命令:

L61hoVf.png

VPepsA3.png

5W2Vz7r.png

6.2 sort、uniq、wc排序命令:

EMZ2U0n.png

VWMr54x.png

6.3 tr、col、join、paste、expand字符转换命令:

1Ds5DkX.png

mTFgktX.png

pNwFffH.png

wUse7PF.png

7Yr6nsm.png

6.4 参数代换xargs:

i4Faprb.png

转载于:https://www.cnblogs.com/agui125/p/9922602.html

你可能感兴趣的文章
CodeForces 980 C Posterized
查看>>
C#泛型列表List<T>基本用法总结
查看>>
Drug side effect extraction from clinical narratives of psychiatry and psychology patients
查看>>
linux定时备份mysql并同步到其它服务器
查看>>
浅谈分布式事务
查看>>
Spring MVC专题
查看>>
linux grep命令详解(转)
查看>>
Java下获取可用CPU数
查看>>
JAVA学习笔记
查看>>
可编程硬件Arduino初探(1)-开发环境搭建
查看>>
Django静态文件配置
查看>>
关于C#中怎样实现点ENTER键就相当于按下确认输出按钮
查看>>
jqGrid 是一个用来显示网格数据的jQuery插件
查看>>
windows 下 gcc/g++ 的安装
查看>>
登陆后跳转到指定页
查看>>
[前端插件]为自己的博客增加打赏功能
查看>>
测试阶段的工作进度
查看>>
《将博客搬至CSDN》
查看>>
ExtJS 刷新后,默认选中刷新前最后一次选中的节点
查看>>
实现一个简单的shell(2)
查看>>