bash基础知识#1

【1】shell相关
set: 查看当前bash里的所有变量。
#查看系统默认SHELL: echo $SHELL
/etc/shells: 文件记录了系统支持的有效登录Shell
更改用户默认shell: 修改/etc/passwd文件中用户记录的最后一个字段。

【2】简单命令
pstree: 查看进程树
pstree -p: 查看进程树时,带着进程ID。

ps aux:静态查看进程信息。
top:动态查看进程信息。

•创建用户并设置密码:
useradd user02
echo Passw0rd | passwd user02 --stdin


【3】bash启动脚本初始化
●登录shell #用户登录时执行的脚本。(会执行以下Step1~Step3)
Step1:执行:/etc/profile
执行/etc/profile后,启动:/etc/profile.d/*.sh # *.sh为运行profile.d下所有的脚本。

Step2:执行家目录下: ~/.bash_profile #对当前用户定制化

●非登录shell(交互式) #在shell命令输入:bash,会执行的脚本。
#非登录shell仅执行第三步。
Step3:执行家目录下: ~/.bashrc #bash的一些配置
执行 ~/.bashrc后,运行:/etc/bashrc #系统的一些公用配置

★触发登录shell
su user01 #仍然是当前shell,不会触发登录shell
su - user01 #将触发登录shell。

●Shell启动配置文件的区别
/etc/profile:配置全局环境变量,影响所有用户
~/.bash_profile :配置个人环境变量,影响一个用户
/etc/bashrc :配置全局的别名或者函数,影响所有用户
~/.bashrc :配置个人别名或者函数,影响一个用户


•影响全局:所有人
/etc/profile 、/etc/bashrc
•影响局部:个人
~/.bashrc 、~/.bash_profile

退出登录Shell:~/.bash_logout

★说明:
.bash_profile:用户每次登录时执行 --->.bashrc
.bashrc:每次进入新的Bash环境时执行(打开一次终端,就执行一次),定义别名 -->/etc/bashrc
.bash_logout:用户每次退出登录时执行
.bash_history 保存上次用户注销前使用的命令


【4】bash的父子进程
①无条件运行多个命令
cmd1 ; cmd2 ; cmd3 #即便命令cmd1报错,后面命令依然会顺序执行。

②在子shell中运行命令
(cmd1;cmd2)#括号括起来后,是在子shell中执行,括号中的命令完,进程结束。其不影响父shell的环境

•echo $$:显示当前bash的pid。

•export 变量名:输出为全局变量。
例:var1="aaaa"
bash #打开新的bash进程
echo $var1 #此时,仍能访问全局变量var1.


★修改环境变量
临时修改:PATH=$PATH:/NeedAddPath
永久修改PATH变量(仅影响当前用户):vim ~/.bash_profile(推荐修改,其它文件没有现成的PATH) #也可以修改~/.bashrc
永久修改PATH变量(影响系统所有用户):vim /etc/profile 或:vim /etc/bashrc

★执行shell的几种方式:
方法1:脚本文件路径 例:test.sh 或:./test.sh
方法2:bash 脚本文件路径 例:bash test.sh
方法3:source 或者. 脚本文件路径 例:source test.sh 或: . test.sh
•区别:方式1和方式2是在子shell进程中执行,方式1需要文件具有可执行权限,方式2不需要可执行权限。
方法3是在当前shell中执行,不需要可执行权限。

【5】产生子进程的4种方式
★以下几个创建子进程的情况。
1:&,提交后台作业If a command is terminated by the control operator `&', the shell executes the command asynchronously in a subshell.
2:管道 Each command in a pipeline is executed in its own subshell
3:括号命令列表 ()操作符 Placing a list of commands between parentheses causes a subshell environment to be created
4:执行外部脚本、程序:When Bash finds such a file while searching the `$PATH' for a command, it spawns a subshell to execute it. In other words, executing filename ARGUMENTS is equivalent to executing bash filename ARGUMENTS 。

★shell提供二种不创建子程序的进程创建方式。
1:source命令,使用方法Source filename ARGUMENTS或. filename ARGUMENTS 此种方法,直接在当前shell进程中执行filename脚本,filename结束后继续返回当前shell进程。
2:exec命令,使用方法Exec filename ARGUMENTS此种方法直接在当前shell进程中执行filname脚本,filename结束后退出当前shell进程。


【6】shell中的变量和作用
•变量的定义
变量名要求以英文字母或下划线开头,不能以数字开头,区分大小写,约定俗成为大写,但不强制;等号两边不要空格。

•如果变量名容易和后边的字母和下划线连在一起导致混淆,则应该使用大括号将变量名括起来${变量名}。

•可以将命令的执行结果直接赋值给变量。
 var2=$( rpm -qf $(which fdisk) ) 

•readonly可将变量设置为只读,变量一旦设置为只读,任何用户不能对此变量进行重新赋值
variable=value #先对一个变量进行赋值
readonly variable #将variable设为只读
•利用unset命令可以清除变量的值
格式:unset 变量名

•建立层级文件夹:mkdir {aa,bb}/{aa,bb} -p

【7】颜色显示功能
\e[31m ----》代表红色
\e[32m ----》代表绿色
\e[33m ----》代表黄色
\e[34m ----》代表蓝色
\e[0m ----》取消前面设置的颜色
30-37都是字体颜色
40-46都是背景颜色
5是闪烁功能
※上述数字不分顺序。
#echo -e "\e[31;46m hello \e[0m"
[root@~]# echo -e "\e[5;31;46mhello world\e[0m"
[root@~]# echo -e "\e[5;31;46mhello\tworld\e[0m"

 

【8】printf命令-格式化输出命令
printf 使用引用文本或由空格分隔的参数,我们可以在printf 中使用格式化字符串。我们还可以指定字符串的宽度、左右对齐方式等。在默认情况下,printf 并不像echo 命令一样会自动添加换行符,我们必须在需要的时候手动添加。
printf “%-5s %-10s %-4s\n” No Name Mark
printf “%-5s %-10s %-4.2f\n” 1 Sarath 80.3456
printf “%-5s %-10s %-4.2f\n” 2 James 90.9989
printf “%-5s %-10s %-4.2f\n” 3 Jeff 77.564
输出结果:
No Name Mark
1 Sarath 80.35
2 James 91.00
3 Jeff 77.56
•解释:
%-5s 格式化为左对齐宽度为5 的字符串替代(-表示左对齐),如果不用-指定对齐方式,字符串则采用右对齐形式。
宽度指定了保留给某个变量的字符数,列和列本身有一个空字符串。对Name 而言,保留宽度为10,所以看起来列和列之间有11个字符串。因此,任何Name 字段的内容都会被显示在10 字符宽的保留区域内,如果内容不足10 字符,余下的则会以空格符填充。如果超过10 个字符,列对齐效果将被打乱。
%-4.2f,其中.2 指定保留2 个小数位,对小数部分四舍五入。注意,在每行格式字符串后都有一个换行符\n。
s 代表是string 字符串类型
f 代表是float 浮点数类型


【9】read 从键盘输入内容为变量赋值
格式: read [选项] 变量名
-p:提示信息
-s:隐藏输入
-t:指定超时时间
-n:指定读取的长度 #其实,输入到指定长度,就自动结束了。
例:

#!/bin/bash
read -p "please input you name: " name
read -n3 -p "input password: " pass
echo -e "\n your username is $name password is $pass"

 

【10】一些命令
basename:取路径中的最后一个文件名。

$$: 当前进程的pid号。
$#: 命令行的参数个数。
$((RANDOM%10)):产生10以内的随机数。
$RANDOM:产生随机数
ls -l -A -R /etc/test | egrep "^d" | wc -l :统计文件夹的个数,包括隐藏文件夹(不含:. 和..)
find /etc/test -mindepth 1 -type d | wc -l :功能同上

•脚本中:

-x :调试脚本;例:bash -x test.sh
read:让脚本在某个地方暂停。

【11】
cat >test.txt <<EOF :接收用户输入到test.txt,然后遇到EOF,输入停止。
查看端口:lsof -i:22
使用lftp客户端,编写脚本执行ftp操作。
登录ftp服务器后,执行的命令是在服务器上的执行结果。 #登录后,默认本地当前路径为登录用户的家目录。
要想执行本地命令:!<shell-command> #在命令前加!号。
例外:lcd #在本机切换目录
mirror命令:
例: mirror /文件夹 #将服务器上的文件夹下载到本地。
mirror -R /文件夹 #将本地文件夹上传到服务器
put :例,put file01 #上传
get: 例,get file02 #下载

【12】-e 选项 执行sql语句,直接对mysql数据库执行操作
1、mysql -u用户名 -p密码 -D数据库名 -e"sql 语句"
mysql -uroot -p123456 -Dmydb -e"select host,user from user";
或:mysql -uroot -p123456 -e"select host,user from mydb.user";
2、
echo "sql 语句" | MYSQL_HOME/bin/mysql -u用户名 -p密码 -D数据库名
echo "select host,user from user" | mysql -uroot -p123456 -Dmydb

【13】shell中的间接引用
 例如:a=5 b=a echo $b 结果为:a echo ${!b} 结果为:5 或: echo $(($b)) 结果为:5 

posted @ 2019-11-18 23:47  山的那一边  阅读(264)  评论(0)    收藏  举报