5

I need to create an empty file using a shell script. The filename will be determined by examining all the files in a directory matching a pattern, say TEST.*, and appending _END to it so that the new file might look like TEST.2011_END. Let the current directory be $DIR. So I tried:

for file in $DIR/TEST.*
do
    touch $file_END  
done

This gives an error. I also tried replacing touch $file_END with:

filename=$file_END  
touch $filename  

but with no luck. What should I do?

Gilles 'SO- stop being evil'
  • 807,993
  • 194
  • 1,674
  • 2,175
Abhishek Anand
  • 223
  • 1
  • 3
  • 5
  • `touch` is often used to create an *empty* file, but its primary purpose it to *touch* a file's *timestamp*... If a file with the name already exist, 'touch' will not make it become "empty".... If you want to force an existing file to be **empty** (thereby losing any data it contains), you can use `cp /dev/null "${file}_END"` which will either create an empty file if it doesn't currently exist, or if it does exist, it will truncate it to zero length (ie. empty)... – Peter.O Apr 01 '11 at 15:42
  • @fred.bear: A common idiom to create or truncate a file is `: >"${file}_END"` – Gilles 'SO- stop being evil' Apr 01 '11 at 21:22
  • See [$VAR vs ${VAR} and to quote or not to quote](http://unix.stackexchange.com/questions/4899/var-vs-var-and-to-quote-or-not-to-quote) – Gilles 'SO- stop being evil' Apr 01 '11 at 21:23

2 Answers2

11

The syntax would be:

filename="${file}_END"

or in your code

touch "${file}_END"

The " quotes are not necessary as long as $file does not have any whitespace or globbing character in it.

Gilles 'SO- stop being evil'
  • 807,993
  • 194
  • 1,674
  • 2,175
Mat
  • 51,578
  • 10
  • 158
  • 140
  • 3
    Always put double quotes around variable substitutions unless you know you need field splitting and pathname expansion. This is a simpler and safer approach than trying to figure out whether they are strictly necessary. – Gilles 'SO- stop being evil' Apr 01 '11 at 21:21
2

the command interpreter thinks you mean $file_END ( value of the variable named file_END ). you can work around this by quoting. The syntax could be:

filename="$file""_END"

or

filename="$file"_END

or even

filename=$file"_END"

though i prefer the first one for clarity!

user6218
  • 121
  • 2