• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

shell编程,awk,git

武飞扬头像
总有刁民想害朕number1
帮助1

编译型:通过编译生成二进制可执行程序,然后直接运行,运行效率高
解释型:需要解释器,通过解释器解释执行,开发效率高

变量:本地变量,环境变量,参数变量

变量

#!/usr/bin/bash
变量
str=hello给变量赋值
val=99
echo "str=$str",访问变量值给变量前加$,带""或不带不影响
//echo输出同printf
str="hello world"必须加"",有空格只会识别一个
mystr=$str拿一个变量给另一个赋值
echo 'str=$str'  ''只会输出字符串,不会取$str的值
\n换行只在printf里有效,其他就是\n
#是屏蔽符
echo "input"
read line(变量)从键盘获取数据
echo "line=$line"
环境变量:已经定义的,可以直接使用
echo $PATH 环境变量
echo "\$0=$0"\将$转为$的意思;环境变量
$0脚本的名字;环境
$$脚本运行的解释器的pid;环境
$#参数个数;环境

$1是传给脚本的第一个参数:参数变量
$2传给脚本的第二个参数参数变量

条件:字符串,算术比较,文件测试

if test -f a.py判断a.py文件是否存在
then
  echo "a.py存在"
fi 代表条件结束

test同[]
echo "input:"
read filename
if [-f "$filename" ]
then 
    echo "$filename 存在"
else
   echo "$filename不存在"    
fi       
 

if [ -d "$filename" ]
then
   echo "$filename 是文件夹"
elif [ -f "$filename" ]
then
    echo "$fiename是普通文件"
else 
    echo "$filename不存在"
fi
                  

字符串比较

if [ "$line" = "123" ]比较输入的值与line是否相等
then
   echo "=="
fi
   
 
if [ -n "$line" ]判断字符串line是否为空,不空则真同!=
then
    echo "$line not null"
 else
    echo "null"
fi          

算术比较

if [ "$line" -lt 100]小于100为真
then
   echo "$line < 100"
fi   

if [ "$line" -lt 0] || [ "$line" -gt 100]大于100真
then 
     echo "成绩不合法"
fi
 
 str=$(ls)是将ls命令的执行结果给str
 str=`str`同上
     

循环

i=1
let "i =1"
echo "i=$i"

i=1
a=$((i  ))将i  的结果赋值给a
a=`expr $i   2`将i 2赋值给a
a=`expr $i \* 2`需要转义


for循环
for i in 1 2 3
do
   echo i=$i
   sleep 1
done


for name in $(ls)
do
  echo "filename:$name"
done
     
有break
while [ : ]空语句恒为真,死循环或者 while true
do 
echo "run"
    sleep 1
done   

三次密码错误就退出

count=0
while true
do 
   echo "password"
   read password
    if ["$password" = 123 ]
      then break
    fi
    ((count  ))
    if [ "$count" -eq 3 ]
    then
       echo "密码验证失败"
       exit 1
    fi   
done
echo "密码正确"      

untile循环

 until [ -f file.txt ]为真不执行,否则执行do
 do 
   echo " not file.txt"
 done
    echo "find file.txt"  

case语句

echo "input"
read line
case "$line" in
    yes|Y|YES) echo "this is yes";;
    no|N|NO) echo "this is no";;当出现这三个字符串都打印
    [][][]|[][]) echo []代表一个字符,当是三个字符或者两个都可匹配
    [1-9]代表1-9d都匹配,[yY],y和Y都匹配,[]只代表一个字符
    *) echo "***"  *可以和任何字符匹配
esac    

函数

(无函数声明,无主函数,无参)
在一个函数内定义的变量,另一个函数也可用(前提是这个函数已被调用)

fun()
   {
      echo "fun run"
      echo "fun: \$#=$#"参数个数
      echo "fun: \$1=$1"
      echo "fun: \$2=$2"
      
   }
fun hello 123   调用函数,hello 123 是两个参数
my_add()
{
  if [ "$#" -ne 2]
  then
     echo "参数有误"
      return 0
 fi
 res=`expr $1 $2`
 return $res     
}
my_add 1 2
echo "$?"代表上一行代码执行的结果或者 r=$?  echo "$?"

为了不让别人使用该变量,可以在函数里加unset  变量名,或者在定义时local 变量名
加unset会将函数外的同名变量也去掉,如果该变量加了local则不会将同名的去掉   

脚本调用脚本

第一个脚本调用第二个脚本时,第一个脚本的变量第二个脚本不能使用,这两个的pid 不同,可以在调用第二个时将将变量以参数传给第二个脚本。
第二种方法将该变量变为环境变量,在第一个脚本中加export 变量名,这时第二个脚本也可以用。
第三种方法在执行第二个脚本时加个.例如. ./d.sh,或者将.换成source,其作用是将两个放在一个解释器中执行

b.sh
#!/usr/bin/bash
echo "b.sh run pid=$$"脚本pid
mystr=hello
export mystr将变量变为环境变量
echo "b.sh mystr=$mystr"
./d.sh调用d.sh脚本 $mystr,这时d.sh脚本可以打印出,这时相当于给d.sh脚本传的参
exit 0

d.sh
#!/usr/bin/bash
echo "d.sh run pid==$$"
echo "d.sh mystr=$mystr"不能打印出,在b.sh中调用d.sh,两个脚本用的是不同的pid
echo "d.sh mystr=$1"

exit 0

awk

awk -F. '{printf $1}' file.txt以.分割file.txt文件,并打印每行第一个分割的字符
awk -F: '{printf $1,$3}' password  每行第一个和第三个字符(用:分割的)
 当以空格分割时不用写-F 
 awk是对文件以某个列进行查看
`awk -F. '{print $1}' file.txt`对file.txt文件以.分割出的第一列进行打印,-F指定分隔符(当使用空格进行分割时,-F可以省略),$1指定打印那一列(第一列)

`awk -F. '{print $1,$2}' file.txt >newfile`将分割出的列重定向到newfile,第一列和第二列都打印
`awk -F:'BEGIN{print "name     uid\n"}{if ($3>=1000) print $1"\t"$3} END{print name         uid}' passwd` 打印头部信息,给1,3行取名为name和uid。if是条件,也有尾部信息

在脚本中kill两个sleep

#!/usr/bin/bash
PIDS=`ps -ef | grep sleep |grep -v "grep"|awk '{printf $2}'`
if [ -z "$PIDS" ]判断是否为空
then 
    echo "没有sleep运行"
    exit 0
fi
for pid in "$pids" 加""会将pids的整个内容直接放在这,一次性全部杀死,不加是一个一个杀死
do
   kill $pid
done    

sed

sed '2i\3.3' file.txt >newfile将3.3插入file.txt文件的第二行,原来的第二行会成为第三行,并且将修改后的存在新文件,旧的文件不会改变

sed '2a\3.3' file.txt >newfile a是将内容附加在第二行

sed '2,3d' file.txt >newfile 删除第二行和第三行 d是删除
sed '1,2p' file.txt 打印文件的第一二行,并且会将原文件也打印
sed -n '1,2p ' file.txt 不打印原文件,只打印第一二行

git

git分布式
svn集中式

四个区:工作区 暂存区 版本仓库 远程仓库

git init创建本机的三个仓库
git add  文件名 将文件存到暂存区
git commit -m "这是主函数"放到版本仓库
git log 历史记录,提交在仓库区的记录
 git checkout 文件名 用新版本覆盖如今修改的版本(工作区)
 git  reset --hard HEAD 将最新版本先隐藏,现在只能看到以前的版本
 git reflog 查看所有版本的序号,可以通过序号来返回之前的新版本
 git reset --hard  序号
   git branch查看当前的几个分支
   git branch dev 创建分支
   git checkout dev 切换到dev分支
   git checkout master切换到master分支
   git merge  分支名(dev)合并分支,将dev和master合并
    git stash 保存现在分支的代码区,这样才可以切换到分支
    git stash list 查找的结果放在引号里 git stash pop "" 这样可以恢复之前的代码区
    git branch -d dev删除分支(当前不处于该分支)
    

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgcakhb
系列文章
更多 icon
同类精品
更多 icon
继续加载