异度部落格

学习是一种生活态度。

0%

shell 常见的循环语句有 for 循环、while 循环、until 循环

for 循环 语法:for 变量 in 列表 do 操作 done 注:变量是要在循环内部用来指代当前所指代的列表中的那个对象的。 列表是在 for 循环的内部要操作的对象,可以是字符串也可以是文件,如果是文件则为文件名。

While 循环 语法:while 表达式 do 操作 done 只要 while 表达式成立,do 和 done 之间的操作就一直会进行。

until 循环 语法:until 表达式 do 操作 done 重复 do 和 done 之间的操作直到表达式成立为止。

1
2
3
4
5
6
7
8
#!/bin/sh
i=1
while [ $i -lt 20 ]
do
echo $i
i=$(($i+1))
# i= $i+1 是错的
done

分支结构主要是 if...else 和 case 这两种,下面用简单的练习代码说明下好了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/sh
echo "Input two number A and B"
read A
read B
echo "A=$A"
echo "B=$B"
if [ $A -gt $B ]; then
echo "A > B"
elif [ $A -lt $B ]; then
echo "A < B"
else
echo "A = B"
fi
exit 0;

运行结果:

1
2
3
4
5
6
Input two number A and B
10
5
A=10
B=5
A > B

说到 if 肯定要有条件判断,在 shell 里面条件判断用的是[..] ,还有一点要注意的是 then 前面的那个分号,要事 then 和 if 在同一行的话就要加上

随便说下,记得以 fi 结尾

下面说下 case 结构:

1
2
3
4
5
6
7
8
#!/bin/sh
echo "Are you OK?:"
read ans
case "$ans" in
yes | y | Y | Yes | YES ) echo "Yes,I'm OK." ;;
no | n | N | No | NO ) echo "No,I'm bad." ;;
* ) echo "Error input."
esac

运行结果:

1
2
3
Are you OK?:
yes
Yes,I'm OK.

本人一直认为 case 结构是一个很麻烦的结构,语法复杂又没什么优势,哎.....

注意点主要是条件末尾的)和语句块后面的;;  ,还有 case 匹配原则是是从上到下的,最后用一个*号,相当与 C 里面的 default 吧

这次要学习一下,参数和环境变量

1
2
3
4
5
6
7
#!/bin/sh
echo "The program's name is $0"
echo "The first parameter is $1"
echo "The second parameter is $2"
echo "The parameter list is $*"
echo "The user's home directory is $HOME"
exit 0

在终端中输入:./ex_02.sh hello killua

执行结果:

1
2
3
4
5
The program's name is ./ex_02.sh
The first parameter is hello
The second parameter is killua
The parameter list is hello killua
The user's home directory is /home/killua

PS:主要环境变量都是大写的,写$Home 程序不会报错,但是没有结果

虽然知道 shell 好久,今天才开始好好学习 shell,鄙视下自己,下面都是练习代码写得不好大牛不要鄙视阿....

1
2
3
4
5
#!/bin/sh
var="Hello World"
echo $var
echo "$var"
echo '$var'

运行结果:

1
2
3
Hello World
Hello World
$var

功能很简单就是显示变量,第一个是直接回显,第二个和第三个感觉很相似,还是有很大区别的。如果你把一个带有$字符的变量放在双引号中,就是把它作为变量使用,如果你是放在单引号中就是没有作用,单引号里面可以放一些不含变量的字符串

还有一个点就是权限,chmod +x ex_01.sh

ok

今天 csdn 的个人空间升级了,恭喜下...

firefox 的在线收藏问题,其实就是一个插件http://download.xmarks.com/download/all  貌似这个插件还支持,IE 和 Safari 什么时候支持下 chrome,等 Linux 版的 chrome 稳定的,我就换 Chrome 的说

多线程这个部分看得晕晕的....

随便搞了段代码...

===================================================================

部分代码如下:

threads.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef THREADS_H
#define THREADS_H
#include <QThread>
class Threads : public QThread
{
Q_OBJECT
public:
Threads();
void setMessage(const QString &message);
void stop();
protected:
void run();
private:
QString messageStr;
volatile bool stopped;
};
#endif // THREADS_H

threads.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <QtCore>
#include <iostream>
#include "threads.h"
Threads::Threads()
{
stopped = false;
}
void Threads::setMessage(const QString &message)
{
messageStr = message;
}
void Threads::run()
{
while(!stopped)
std::cout << qPrintable(messageStr) <<std::endl;
}
void Threads::stop()
{
stopped = true;
}

threadDialog.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef THREADDIALOG_H
#define THREADDIALOG_H
#include <QDialog>
#include "threads.h"
class ThreadDialog : public QDialog
{
Q_OBJECT
public:
ThreadDialog(QWidget *parent = 0);
protected:
void closeEvent(QCloseEvent *event);
private slots:
void startOrStopThreadA();
void startOrStopThreadB();
private:
Threads threadA;
Threads threadB;
QPushButton *threadAButton;
QPushButton *threadBButton;
QPushButton *quitButton;
};
#endif // THREADDIALOG_H

threadDialog.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <QtGui>
#include "threaddialog.h"
ThreadDialog::ThreadDialog(QWidget *parent) : QDialog(parent)
{
threadA.setMessage("Thread A is start");
threadB.setMessage("Thread B is start");
threadAButton = new QPushButton(tr("Start A"));
threadBButton = new QPushButton(tr("Start B"));
quitButton = new QPushButton(tr("Quit"));
quitButton->setDefault(true);
connect(threadAButton, SIGNAL(clicked()),this, SLOT(startOrStopThreadA()));
connect(threadBButton,SIGNAL(clicked()), this, SLOT(startOrStopThreadB()));
connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));
QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(threadAButton);
layout->addWidget(threadBButton);
layout->addWidget(quitButton);
setLayout(layout);
setWindowTitle(tr("Thread Test"));
}
void ThreadDialog::startOrStopThreadA()
{
if (threadA.isRunning()) {
threadA.stop();
threadAButton->setText(tr("Start A"));
} else {
threadA.start();
threadAButton->setText(tr("Stop A"));
}
}
void ThreadDialog::startOrStopThreadB()
{
if (threadB.isRunning()) {
threadB.stop();
threadBButton->setText(tr("Start B"));
} else {
threadB.start();
threadBButton->setText(tr("Stop B"));
}
}
void ThreadDialog::closeEvent(QCloseEvent *event)
{
threadA.stop();
threadB.stop();
threadA.wait();
threadB.wait();
event->accept();
}

这个程序没有优化,感觉有点站内存的说,看看就好哈

Multiget 安装

1
sudo apt-get install multiget

把 Multiget 和 Firefox 连接起来的方法很简单,通过 Flashgot 插件完成

  1. 打开 Flashgot 选项,点击"常规"标签页。

  2. 因为下载管理器里面是没有 Multiget 的,所以点击"新增",填入 Multiget。

  3. 选择程序/usr/bin/multiget

  4. 在参数模板中写入,把全角的括号改成半角的。 引用

[url=URL][refer=REFERER]

  1. 确定 OK。

thunderbird邮件提醒设置 如果你使用 Ubuntu 9.04,给 ThunderBird 安装Mozilla Notification Extensions就可以让它使用 LibNotify 新通知系统 下载地址:https://addons.mozilla.org/en-US/thunderbird/addon/11530

thunderbird最小化到托盘 由于 thunderbird 没有最小化到托盘的扩展,这里用Alltray来模拟: sudo apt-get install alltray

新建文件,thunderbirdStart.sh 内容如下:

1
2
#!/bin/bash
alltray thunderbird

保存退出,并使文件可执行

打开System->Preferences->Sessions 添加此文件使之开机时运行

同样的方法也可以添加其他程序

添加联系人侧边栏 安装Contacts Sidebar插件就可以了 下载地址:https://addons.mozilla.org/en-US/thunderbird/addon/70

方法一:添加命令到rc.local

方法二:系统->首选项->启动程序(会话)

Ubuntu 运行程序不用密码的方法,其实就是修改权限

1
sudo chmod 4577 XXX

显然 include 是没错的,可是怎么也找不到这个文件,程序编译不过.....

解决方案如下:

在 XXX.pro 文件中添加一行

1
QT += sql

就可以了,这个方法还可以用再其他场合...要是找不到什么头文件可以考虑试试