shell 脚本
ls /:文件系统 ls /etc/rc
ctrl + z :从前台切到后台 fg :从后台转到前台
Shell 是命令解析器,将用户的输入的指令变化为机器可以运行的程序
程序: 第一行固定 #!/bin/sh 或 #!/bin/bash
如: #!/bin/sh
#print hello world in the console window
a=”hello world”
echo $a (也可写成 echo ${a})
shell脚本中常用:$# 传入脚本的命令行参数
$* 所有命令行的参数值,在各个参数值之间留有空格
$0 命令本身(shell文件名)
$1 第一个命令行参数
$2 第二个命令行参数
例1:想在一个文件夹中创建shell文件夹,shell里存放 a b c, a b c里又分别存放 a.txt b.txt c.txt
步骤: 1. mkdir shell 2.cd shell/ 3.vim test.sh 4.chmod 777 test.sh
5 ./test.sh a b c
程序: #!/bin/bash
echo "HELLO TEST"
if [ $# -ne 3 ]; then
echo "Usage : $0 dirname1 dirname2 dirname3"
exit 2
elif [ $# -eq 3 ]; then
echo $1
echo $2
echo $3
echo $*
fi
for dir in $1 $2 $3
do
mkdir ${dir}
cd ${dir}
touch ${dir}.txt
echo "hello world"> ${dir}.txt
cd ..
done
结果: HELLO TEST
a
b
c
a b c
> 和 >>都是重定向符
echo xxx > 文件 第二次在执行的话 第二次的xxx会覆盖第一次的xxx内容,而>> 不会覆盖。
例2:&&与||
在home目录下书写a.sh
程序:#!/bin/sh
a=/home
[ -r "$a" ] && echo "hhhh"
[ -f "$a" ] || echo "gggg"
最后./a.sh 结果为两句话都输出 "hhhh"
"gggg"
例3:在home目录下书写 b.sh 判断输入的是大写字母、小写字母、数字还是其他
#!/bin/bash
read b
case ${b} in
[A-Z] ) echo "Uppercase Letter";;
[a-z] ) echo "Lowercase Letter";;
[0-9] ) echo "Number";;
* ) echo "Unknown";;
esac
Kill -9 `ps -elf | grep test | awk ‘{print $4}’`
这句语句意味着把`ps -elf | grep test | awk ‘{print $4}’`的结果作为kill -9的输入
在c语言中 全为0 如00000...000 结果表示0
开头字符为1其余为0 如1000...000 结果表示为负数的最大值
例4:计算int short double long char char* 的长度
C语言中有32个关键字
sizeof: 是关键字,不是字符,意义是求这种类型的数据的长度。
strlen: 则是计算到\0为止,计算\0之前的长度。
#include<stdio.h>
int main()
{
printf("int %d\n",sizeof(int));
printf("short %d\n",sizeof(short));
printf("double %d\n",sizeof(double));
printf("long %d\n",sizeof(long));
printf("char %d\n",sizeof(char));
printf("char * %d\n",sizeof(char *));
return 0;
}
最后./1 得出结果:
int 4
short 2
double 8
long 4
char 1
char * 4
例5:先猜测下列程序的值,在运行程序验证你的猜想
#include<stdio.h>
#include<string.h>
int main()
{
char a[1000];
int i;
for(i=0;i<1000;i++)
{
a[i]=-1-i;
//printf("%d ",a[i]);
}
printf("%d",strlen(a));
return 0;
}
最后./2得出结果为255
分析:可去掉程序中的// 打印出a[i]的值,可以明显得出第256位是0,而0经过转化就是 \0,strlen就是计算到\0为止,只计算之前的长度为255
思考题: unsigned int a=3;
unsigned j;
J=a*(-1) 计算结果
volatile 与 const
volitile: 防止编译的时候被优化。
const:修饰一个只读变量。 如 const int cc=3 cc是只读变量。只能说明,不能通过cc这个变量去修改它对应内存空间的值。
面试题
const int *p 地址p指向的内容不可改变
int * const p 地址p不可改变
const int * const p 地址p和地址p指向的内容两者皆不可改变
原因是const 有就近原则,靠近谁就限制谁。