复习:
用户管理:
sudo adduser u1
sudo userdel -r u1
硬链接
软链接
ln 源文件 链接文件
ln -s 源文件 链接文件
重定向
标准输入-键盘
标准输出-屏幕
标准错误输出-屏幕
>file
>>file
2>file
ifconfig eth0 ip
ping
sudo shutdown -r +30
sudo reboot
tar cvfz 包 被压缩
tar xvfz 包 -C 路径
tar cvfj
xvfj
umask 000
一、shell
1.shell脚本后缀名.sh
2.执行脚本:
(1)
chmod a+x ex1.sh
./ex1.sh
(2)bash ex1.sh //bash是shell脚本解释器
3.注释
#!/bin/bash #告诉终端 执行这个脚本使用你哪个shell解释器 默认bash
#是注释 可以注释一行
mkdir happy
cd happy
touch tmp
ls
mkdir happy
cd happy
touch tmp
ls
4.脚本里可以定义变量 可以使用环境变量
///
#!/bin/bash #告诉终端 执行这个脚本使用你哪个shell解释器 默认bash
NAME="yang"
echo $NAME
NAME1=$NAME
echo $NAME1
echo "name is $NAME" #不完全输出 如果双引号里边有变量 那么输出变量的值
echo 'name is $NAME' #完全输出 如果但引号里边有变量 则输出变量名
使用变量需要注意:
a、shell中变量名尽量大写
b、=两边步可以加空格
c、变量赋值都是字符串 赋值直接定义就可以
练习:创建一个目录 目录中创建文件 显示目录中文件
//vi a.sh
#!/bin/bash
mkdir aa
cd aa
touch file
cd ..
ls aa
//chmod a+x a.sh
//./a.sh
5.系统预设变量 $0,$1,$2 ....$#,$*
$0 保存脚本名称
$1 保存第一个选项参数
$2 保存第二个选项参数
$3 保存第三个选项参数
$# 保存参数个数
$* 保存所有选项参数 以空格隔开
/
#!/bin/bash
echo "0 is $0" #./a.sh
echo "1 is $1" #aa
echo "2 is $2" #bb
echo " 3 is $3" #cc
echo "# is $#" # 3
echo "* is $*" # aa bb cc
///
./a.sh aa bb cc
练习:从参数里读出目录名称及文件名称
参数1:目录名
参数2:文件名
根据目录名创建一个目录
进入目录
在目录中创建文件(参数2)
//
#!/bin/bash
echo "i am going to create $1"
mkdir $1
cd $1
echo "i am going to create $2"
touch $2
6. read
//
#!/bin/bash
echo "please input name:"
read NAME #等待输入 输入内容存到NAME变量中
echo "name is $NAME"
#################################################################
#!/bin/bash
read -p "please input name:" NAME #先输出字符串 再等待用户输入
echo "name is $NAME"
##########################################
练习:从参数里读出目录名称及文件名称
参数1:目录名
参数2:文件名
根据目录名创建一个目录
进入目录
在目录中创建文件(参数2)
############################################
#!/bin/bash
read -p "please input dirname:" DIRNAME
mkdir $DIRNAME
cd $DIRNAME
read -p "please input filename:" FILENAME
touch $FILENAME
##############################################
7.算术运算 + = \* / %
expr 3 + 5 -->8
expr 3 \* 5 -->15
expr 3 % 2 -->1
expr 3 / 2 -->1
`` //不是单引号 是反引号 作用是提取输出 保存到一个变量
##################
#!/bin/bash
OUTPUT=`ls`
echo "$OUTPUT"
SHOW=`date`
echo "$SHOW"
##################
#############################
#!/bin/bash
NUM1=5
NUM2=3
NUM3=`expr $NUM1 + $NUM2`
NUM4=`expr $NUM1 \* $NUM2`
NUM5=`expr $NUM1 / $NUM2`
NUM6=`expr $NUM1 % $NUM2`
echo "$NUM3 $NUM4 $NUM5 $NUM6"
#############################
8.逻辑表达式
(1)判断两个字符串是否相等
$NAME = "xiaoming" #判断NAME变量中的值是否是xiaoming 判断符号=
注意:=符号两边必须加空格
if条件语句
if [ 条件 ] #中括号两边要加空格
then
语句1
else
语句2
fi #表示if语句结束
##################################
#!/bin/bash
read -p "please input name:" NAME
if [ $NAME = "xiaoming" ]
then
echo "he is xiaoming"
else
echo "he isn't xiaoming"
fi
####################################
(2)判断一个整数与另一个整数关系
num1 -eq num2 #-eq 判断是否相等
num1 -gt num2 #-gt 判断是否大于
num1 -lt num2 #-lt 判断是否小于
###################################
#!/bin/bash
read -p "please input num1: " NUM1
read -p "please input num2: " NUM2
if [ $NUM1 -gt $NUM2 ]
then
echo "$NUM1 > $NUM2"
else
echo "$NUM1 <= $NUM2"
fi
####################################
练习:实现输入一个数字 判断其是否为偶数
#!/bin/bash
read -p "please input num1: " NUM1
NUM2=`expr $NUM1 % 2 `
if [ $NUM2 -eq 0 ]
then
echo "even"
else
echo "odd"
fi
(3)判断文件是否存在
-e filename #判断如果文件存在则为真 不管文件的类型
-d filename #如果文件存在并且是目录 则为真
-f filename #如果文件存在且为普通文件(可执行文件也是普通文件) 则为真
-r filename #判断文件是否有只读权限
-w filename #判断文件是否有写权限
-x filename #判断文件是否有执行权限
###################################################
#!/bin/bash
read -p "please input filename: " FILENAME
if [ -d $FILENAME ]
then
echo "is dir"
elif [ -f $FILENAME ]
then
echo "is commen file"
else
echo "haha"
fi
########################################################
练习:
练习:从参数里读出目录名称及文件名称
参数1:目录名
参数2:文件名
根据目录名创建一个目录
进入目录
在目录中创建文件(参数2)
增加:
(1)如果目录存在 则不创建 如果该目录不存在则创建
(2)如果目录无写的权限 不创建文件
(3)如果文件已经存在 则不创建
对于目录而言:
r 可以浏览目录
w 可以在目录中创建文件
x 可以进入这个目录
如果目录已经存在
输出信息
否则
创建目录
如果目录可写
进入目录
如果文件已存在
输出信息
否则
创建文件
#!/bin/bash
read -p "please input dirname: " DIRNAME
if [ -d $DIRNAME ]
then
echo "$DIRNAME has existed"
else
mkdir $DIRNAME
fi
if [ -w $DIRNAME ]
then
cd $DIRNAME
read -p "please input filename:" FILENAME
if [ -f $FILENAME ]
then
echo "$FILENAME has existed"
else
touch $FILENAME
fi
fi
9.
for 变量名 in 单词表
do
语句
done
########################################################
#!/bin/bash
NAMELIST="liuyang liuhuan quhaoyuan zenghao sui doudou"
for NAME in $NAMELIST #NAME会取NAMELIST里的每一个值
do
echo "name is $NAME"
done
#########################################################
练习: for循环实现创建a.1 a.2 a.3 ....a.9
#!/bin/bash
NAMELIST="1 2 3 4 5 6 7 8 9"
for NAME in $NAMELIST #NAME会取NAMELIST里的每一个值
do
touch a.$NAME
done
练习:for循环实现将某一个目录aa里所有的文件拷贝到目录bb中(不用cp -r )
read -p "please input SRCNAME:" SRCNAME
read -p "please input DESNAME:" DESNAME
LIST=`ls $SRCNAME`
mkdir $DESNAME
for NAME in $LIST
do
cp $SRCNAME/$NAME $DESNAME
done
10.
while循环
while [ 条件 ]
do
语句
done
#####################################
#!/bin/bash
I=1
SUM=0
while [ $I -lt 101 ]
do
SUM=`expr $SUM + $I`
I=`expr $I + 1`
done
echo "$SUM"
#####################################
练习:创建一个目录tmpdir 然后使用while循环 在tmpdir里创建文件tmp.1 tmp.2 ...
tmp.8
#!/bin/bash
read DIRNAME
mkdir $DIRNAME
cd $DIRNAME
I=1
while [ $I -lt 9 ]
do
touch tmp.$I
I=`expr $I + 1`
done
11. break continue
#!/bin/bash
I=1
SUM=0
while [ $I -lt 11 ]
do
if [ $I -eq 10 ]
then
break #break 结束循环 break允许跳出n层循环 break n
fi
SUM=`expr $SUM + $I`
I=`expr $I + 1`
done
echo "$SUM"
continue:结束本次循环 进入下一次循环的判断 去掉本次循环剩余的代码
shell中continue continue n 表示将n层循环剩余的代码都去掉
12.case语句
case $变量名 in
模式1)
语句
;;
模式2)
语句
;;
......
*)
语句
;;
esac
###########################
#!/bin/bash
read -p "input num:" NUM
case $NUM in
1)
echo "Monday"
;;
2)
echo "Tuesday"
;;
*)
echo "relax"
;;
esac
###############################
三、linux环境
编辑器 vi
编译器 gcc
调试工具 gdb
1.gcc编译器 编译程序检查文件类型
.c c语言源文件
.cpp c++源文件
.s 汇编语言文件
.java java源文件
2.gcc编译步骤
gcc a.c -o a //-o 为a.c 生成的可执行文件起别名
./a
编译经历4步:预处理 编译 汇编 链接
(1)预处理:
a、如果有头文件 会将头文件内容拷贝到源文件中
b、如果源程序有注释 会将注释去掉
c、如果源程序中有宏定义 会用宏值替换宏名
linux@ubuntu:~/180705$ gcc -E hello.c -o hello.i
gcc -E 将编译过程停留在预处理阶段 预处理文件后缀名.i
(2)编译:将.c 源文件生成汇编语言源文件
linux@ubuntu:~/180705$ gcc -S hello.c -o hello.s
gcc -S 将编译过程停留在编译阶段 汇编语言文件后缀名.s
(3)汇编:将.c源文件生成机器码文件
linux@ubuntu:~/180705$ gcc -c hello.c -o hello.o
gcc -c 将编译过程停留在汇编阶段 目标文件后缀名.o
(4)链接 :多个.o目标文件 库文件 链接到一起
gcc hello.c -o hello
作业1:
编写一个shell脚本程序 它能根据输入的命令行参数采取不同的动作
如果是目录 则列出目录中所有文件
如果是可执行文件 则用shell 执行它
如果是可读文件 则分页显示其内容(less)
#!/bin/bash
if [ -d $1 ]
then
ls $1
elif [ -x $1 ]
then
./$1
elif [ -r $1 ]
then
less $1
fi
作业2:
编写一个菜单 并实现菜单里的功能
***********************************
*MENU*
*1.copy 2.rename
*3.remomve 4.exit
***********************************
例如:用户按下1 则提示用户输入源和目的文件 然后执行拷贝
输入数字2 则提示用户输入要更改的文件或目录名 然后执行更名操作
输入数字3 则提示用户输入要删除的文件名 然后执行删除操作 rm -rf
输入数字4 退出shell程序
#!/bin/bash
while [ 1 ]
do
echo "****************************"
echo " *MENU* "
echo " *1.copy 2.rename "
echo " *3.remomve 4.exit "
echo " "
echo "****************************"
read -p "请输入数字:" NUM
case $NUM in
1)
read -p "请输入源文件:" YNEME
read -p "请输入目的文件:" MNEME
cp $YNEME $MNEME
;;
2)
read -p "请输入要更改的文件名:" GNEME
read -p "请输入更改后的文件名:" HNEME
mv $GNEME $HNEME
;;
3)
read -p "请输入要删除的文件名:" SNEME
rm -rf $SNEME
;;
4)
exit
;;
esac
sleep 2
clear
done