Linux-shell的经验总结-1

Linux-shell的经验总结-1

    • shell运行环境技巧
        • 子shell相关问题
        • shell运行script的方式
        • export命令-脚本执行结果的输出和引用
        • 在一个shell脚本中引入另一个脚本
    • shell动态生成数组
    • 脚本里面信号量的处理
    • 脚本的LOCKFILE
    • 主机信息获取
    • 输出格式化相关命令
          • 解决echo变量换行\n丢失的问题
    • 主机运行资源查看命令
      • 主机检测命令

shell运行环境技巧

子shell相关问题

  • linux的shell运行环境每次用户登录都会开启一个终端,初始化一个shell登录环境,相当于一个子shell。linux的用户登录shell会执行下面脚本。
  • (用户登录shell环境流程可以自行详细另外查看)
]#source /etc/profile
]#source /etc/profile.d/* #用户可以自定义环境初始化脚本
]#source ~/.bash_profile
  • 每个子shell在linux是一个单独的进程。当你在用户登录的shell环境运行一个shell脚本就是一个子shell。
  • 用户退出登录后再次登录相当于再次初始化shell环境,运行了另一个进程。

shell运行script的方式

[1] source 或者 . 方式运行脚本,脚本不需要可执行权限
相当于在当前登录shell环境执行命令,不是子shell。

]# source example.sh
]# . exaple.sh

[2] sh或者bash方式运行脚本,脚本不需要可执行权限
是子shell的方式执行脚本内容,单独一个进程。

]# sh example.sh
]# bash example.sh

[3] 路径的方式执行相当于执行bash方式执行。脚本需要可执行权限

]# ./mytemp/example.sh

export命令-脚本执行结果的输出和引用

  • 在shell环境定义的变量都是全局变量、在函数内可以使用local修饰定义一个局部变量。
  • 在shell环境中用export修饰一个变量或者函数可以使这个变量作用于子shell环境。
  • export想当于declare -x命令。
  • 常用于定义环境变量
]# cat a.sh
export JAVA_HOME=/usr/local/java
export HADOOP_HOME=/usr/local/hadoop
function example{
    echo  "Hellow World"
}
export -f example
]# source a.sh
]# echo $JAVA_HOME
]# /usr/local/java
]# example
]# Hellow World
  • export的用法
  • -p 显示当前shell所有环境变量
[root@localhost ~]# export -p
declare -x CVS_RSH="ssh"
declare -x G_BROKEN_FILENAMES="1"
declare -x HISTSIZE="1000"
...

参数讲解

  • -f  代表[变量名称]中为函数名称。
  • -n  删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。
  • -p  列出所有的shell赋予程序的环境变量。

在一个shell脚本中引入另一个脚本

source方式,如同上面讲解的source一样,相当于当前环境运行script,并非开启子shell。

exec方式:脚本运行至exec处,进入子脚本内容,并非开启子shell,后续父脚本无法运行。

#!/bin/bash
echo "Hellw"
exec a.sh
echo "World"

fork方式就是上面的路径执行脚本方式,可以是相对路径,也可以是绝对路径,开启子shell方式运行,子shell可以继承export变量。

cd /opt
./zookeeper_env.sh
echo "Hellow world"

shell动态生成数组

  • seq 生成数组
]# seq 5 10
]# $a = 1 ; $b = 10
]# seq $a $b
  • { … }方式生成数组
for i in {5..10}
do
   echo $i
done
#可以生成字母
for i in {a..z}
do
  echo $i
done
#eval 的使用类似于python的eval()函数。
]# a=1;b=10
for i `eval echo {$a..$b}`
do
 echo $i
done
  • 循环文件每行内容
# 推荐使用
while read -r line 
do
	echo $line
done < a.txt
#
for line in `cat a.txt`
do
	echo $line
done

脚本里面信号量的处理

kill 和信号量
trap

脚本的LOCKFILE

lockfile文件可以防止脚本启动多次。

PIDFILE=/dev/shm/pid.txt
if [ -e ${PIDFILE} ] && kill -0 `cat ${PIDFILE}`
then
  echo "already running"
  exit
fi
trap "rm -f ${PIDFILE}; exit" INT TERM EXIT
echo $$ > ${PIDFILE}

主机信息获取

使用python的socket模块可以获取主机名和IP
lsblk
lscpu
lsmem
fdisk

输出格式化相关命令

解决echo变量换行\n丢失的问题
echo $VAR_TEST
#改为
echo "${VAR_TEST}"

jq格式还输出json的命令,类似chrome的jsonhandler和jsonviewer插件。
printf

主机运行资源查看命令

top
sar
ss/netstat
free
iostat
df
ps

主机检测命令

网络层面检测命令

ping
route
nc
telnet
curl -w

你可能感兴趣的:(linux,shell)